プロジェクトの設定には次のスキームがあります。
myproject/
app1/
app2/
appN/
settings/
__init__.py
base.py
devel.py
production.py
私のローカル環境では、virtualenvwrapper のpostactivate
スクリプト内にあります。
myproject_root=/home/rantanplan/Projects/repos/myproject
cd $myproject_root
export DJANGO_SETTINGS_MODULE=myproject.settings.devel
私が行うworkon myproject
と、プロジェクトのルートディレクトリに変更され、必要なアクティブDJANGO_SETTINGS_MODULE
が設定されます。
これは django では問題なく、すべてのコマンド ( などpython manage.py syncdb
) が機能します。
一方、次のファブリック タスクがあります。
@task
def syncdb():
local('python manage.py syncdb --noinput')
これは、単純なsettings.py
ファイルを持っていたときに正常に機能していましたが、上記のスキームに変更すると、次の例外が発生します。
django.core.exceptions.ImproperlyConfigured: settings.DATABASES is improperly configured. Please supply the ENGINE value. Check settings documentation for more details.
Fatal error: local() encountered an error (return code 1) while executing 'python manage.py syncdb --noinput'
Aborting.
いくつかの追加メモ:
- project関数は、すべての django 設定モジュールが "settings" と名付けられていると (内部的に) 誤って想定しているため、ここでは適用できません。
- 私はsettings_module関数を無駄にしようとしました。
os.environ
内部的に使用して環境変数を設定しますが、効果はありません。 os.environ['DJANGO_SETTINGS_MODULE']
タスク定義の直前を印刷すると、「myproject.settings.devel」が正しく印刷されます。
では、私はここで何を間違っていますか? この問題を解決するにはどうすればよいと思いますか?
手間を省くために、次のようにすることでこれを解決できることを知っていると言わなければなりません。
def syncdb():
with prefix('export DJANGO_SETTINGS_MODULE=myproject.settings.devel'):
local('python manage.py syncdb --noinput')
しかし、できればの使用は避けたいと思いprefix
ます。
また、ハイネクサーが示唆するように、私はできることを知っています:
@task
def syncdb():
local('python manage.py syncdb --settings=myproject.settings.devel --noinput')
local
しかし、なぜが を尊重しないのDJANGO_SETTINGS_MODULE
か、なぜsettings_module
広告どおりに機能しないのかを知りたいと思っています。