見出し画像

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())
 
〜 実行結果が出力される 〜

これだけです!

ここまでお読みいただきありがとうございました!


参考


この記事が気に入ったらサポートをしてみませんか?