我有我的项目的设置如下方案: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