我的项目设置有以下方案:
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.
一些附加说明:
- 项目功能在这里不适用,因为它错误地假设(内部)所有 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
不像宣传的那样工作。