我有我的項目的設置如下方案:Python的織物「本地」功能不尊重環境變量DJANGO_SETTINGS_MODULE
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_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
。
而且我知道我能做到,因爲hynekcer提示:
@task
def syncdb():
local('python manage.py syncdb --settings=myproject.settings.devel --noinput')
,但我真的想知道爲什麼local
不尊重DJANGO_SETTINGS_MODULE
和 爲什麼settings_module
不起作用像廣告。
我無法重現該問題。環境變量DJANGO_SETTINGS_MODULE和settings_module適用於我。你使用Django 1.4嗎?你可以在不同的機器上重現它嗎? – hynekcer
@hynekcer當你說你不能重現問題時,我認爲你有一個類似'settings'的方案,而不是一個簡單的'settings.py'?是的,我有django 1.4和最新的pip可安裝結構。 – rantanplan
是的,配置'myproject/settings/anyfile.py',一個空的'myproject/settings/__ init __。py'和和你一樣的fabfile.py。 – hynekcer