【发布时间】:2012-11-11 16:43:53
【问题描述】:
我的项目设置有以下方案:
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 当你说你无法重现问题时,我认为你有一个与我类似的
settings方案,而不是一个简单的settings.py?是的,我有 django 1.4 和最新的 pip 可安装结构。 -
是的,配置
myproject/settings/anyfile.py,一个空的myproject/settings/__init__.py和和你一样的fabfile.py。 -
@hynekcer 将尝试在不同的系统上重现并回复您。
标签: python django deployment fabric