読者です 読者をやめる 読者になる 読者になる

Django1.9から、django-adminやmanage.pyに加え、`python -m django`が使えるようになった

Django Python

Djangoのドキュメントを見ていたら、django-adminmanage.pyに加えて、python -m djangoコマンドラインから使えるようになっていました。
django-admin and manage.py | Django documentation | Django

 
どんな感じなんだろうと思いと調べた時のメモを残します。

 

調べたこと

python -m djangoに関係するTicketやPRなどを見たところ、Django ticket #24857(GitHub上だと#4588)がありました。

 
そのPRで作成されたソースコードは、django/__main__.pyにありました。
django/__main__.py at 53ccffdb8c8e47a4d4304df453d8c79a9be295ab · django/django

 
また、Pythonmオプションの動作については、公式ドキュメントに

通常のモジュールの代わりにパッケージ名が与えられた場合、インタプリタ.__main__ を main モジュールとして実行します。

1. コマンドラインと環境 — Python 3.5.1 ドキュメント

とあり、この 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

 

その他参考