Djangoのドキュメントを見ていたら、django-admin
やmanage.py
に加えて、python -m django
がコマンドラインから使えるようになっていました。
django-admin and manage.py | Django documentation | Django
どんな感じなんだろうと思いと調べた時のメモを残します。
調べたこと
python -m django
に関係するTicketやPRなどを見たところ、Django ticket #24857(GitHub上だと#4588)がありました。
- #24857 (Add __main__ entry point as an alias for django-admin) – Django
- Fixed #24857 -- Added "python -m django" entry point. by ryanhiebert · Pull Request #4588 · django/django
そのPRで作成されたソースコードは、django/__main__.py
にありました。
django/__main__.py at 53ccffdb8c8e47a4d4304df453d8c79a9be295ab · django/django
また、Pythonのm
オプションの動作については、公式ドキュメントに
通常のモジュールの代わりにパッケージ名が与えられた場合、インタプリタは
.__main__ を main モジュールとして実行します。
とあり、この django.__main__.py
が実行されるようでした。
python - What is __main__.py? - Stack Overflow
試してみた
python -m django
を試してみます。
上記の__main__.pyのソースコードコメントにもありますが、実際にはdjango-admin
を呼び出しているため、
# プロジェクトの作成 >python -m django startproject myproject . # アプリの作成 >python -m django startapp myapp
などができます。
ただ、中身はdjango-admin
なので、単にmigrateすると
>python -m django migrate ... django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
というエラーになります。デフォルトではDJANGO_SETTINGS_MODULE
の指定がないためです。
一方、python -m django startproject myproject
により生成されるmanage.pyは
#!/usr/bin/env python import os import sys if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings") from django.core.management import execute_from_command_line execute_from_command_line(sys.argv)
と、DJANGO_SETTINGS_MODULE
が指定されています。
そのため、マイグレーションするときなどsettings
の指定が必要な時は、
# "python -m django startproject myproject ." でプロジェクトを作成した場合 >python -m django migrate --settings=myproject.settings
と、django-adminと同じように指定すれば動作します。
Django settings - Designating the settings | Django documentation | Django