Django_対話型シェルで特定のモジュールを動かしてみる_DJANGO_SETTINGS_MODULE #349日目
久しぶりの更新になってしまいました・・!
先週末に数年ぶりの家族旅行に出掛けていたのと、旅行先で子供が胃腸炎になり、家族が順番に罹患していったのが大きかったです。。
また徐々にアウトプットしていきたいと思います。
Djangoの開発業務で使えるTipsを教わったのでメモしておきます。
新たにメソッドを定義した時など、対話型シェルでサクッと動作確認したいケースがあると思います。しかしDjangoで開発していると、特定の部分だけ動かしてみるには少しコツが必要です。
試したい処理を適当なファイルに書いてみて、Djangoプロジェクト内の適当な場所に置いておきます。自分の環境ではsettings.pyの場所が少し変わっていますが、settings.pyがどこにあるかが後ほど重要になるので、ご自身の環境に置き換えて見てみてください。
myapp ------ 各種プロダクションコード
config ----- settings.py
` wsgi.py
manage.py
test.py # 試したい処理を書いたファイル
まず結論としてはtest.pyの冒頭に以下のコードを書きます。
[test.py]
import os
import django
os.environ['DEBUG_MODE'] = 'False'
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
django.setup()
〜 ここから下にテストしたい処理やメソッドを書く 〜
何をしているかと言うと、settingsの読み込み先が「config.settings」であることを定義しています。つまりDJANGO_SETTINGS_MODULEという環境変数がsettingsの場所を持っているということです。
そのうえでdjango.setup()でDjangoを立ち上げてから処理を開始するようにしています。
ちなみにDJANGO_SETTINGS_MODULEはmanage.pyとwsgi.pyの2ファイルで記述されています。
[manage.py]
import os
import sys
def main():
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
[wsgi.py]
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
application = get_wsgi_application()
test.pyを実行した際に、まずこの環境変数が取り込まれるようにしておくことで、Djangoの枠組みの中でコードをテストすることが可能になります。
modelsをimportして触ってみたり、プロダクションコードで定義しているメソッドをimportして新たな処理をしてみたり、本番と同様に扱えます。
実際にテストする流れもみてみます。
まずは対話型シェルを立ち上げます。
$ python manage.py shell
シェルが立ち上がったらpythonファイルを実行するコマンドを叩きます。
[1] exec(open('redis_test.py').read())
〜 実行結果が出力される 〜
これだけです!
ここまでお読みいただきありがとうございました!
参考
この記事が気に入ったらサポートをしてみませんか?