如何手动将我的production_settings添加到sys.path以运行syncdb?

问题描述:

在生产服务器上,我想同步数据库。如何手动将我的production_settings添加到sys.path以运行syncdb?

如果我只是做了该

django-admin.py syncdb会挑settings.py。但我有一个额外的settings-production.py从设置继承。

因此,我想出了这个:

django-admin.py syncdb --settings=/path/to/settings_production 

ImportError: Could not import settings '/path/to/settings_production' (Is it on sys.path?): Import by filename is not supported.

我用Google搜索,发现有人有类似的问题here。然而令我困惑的是,WSGI.py只能被Apache读取。不是,如果我自己运行命令。那里的答案对我来说并不合适。

如何手动在sys.path中添加我的production_settings以运行syncdb? 非常感谢,

首先确保settings_production.pysettings.py位于同一个目录中。

因为你是从设置继承,你可以在settings.py底部添加:

try: 
    from settings_production import * 
except ImportError: 
    pass 

如果你想使用settings_production.py确保它拥有所有的设置为您的应用(数据库,等人)然后:

DJANGO_SETTINGS_MODULE=settings_production python manage.py syncdb

编辑

我要发布它作为一个评论,但它变得太长:

我就是这么做的,因为通常在制作一个只改变,你可以在主settings.py导入几个值;并使用变量的最后一个值(因此如果您在settings_production.py中设置生产数据库,则使用该设置)。

这样更简单,因为django默认会查找settings.py;避免必须处理环境变量和导入路径,特别是如果你正在改变小事情。

这种方法有一些缺点;例如我无法想象它的便携性,特别是如果您有多个环境(staging/testing/production/dev),那么您有多个from _foo_ import *语句,并且可能导致问题,因为导入的顺序变得很重要;如果你忘记了并且围绕着一个流氓settings_*.py左右 - 例如测试环境也得到了dev文件,因为有些开发人员忘了将它从测试分支中删除。

对于更复杂的设置,其更容易保留完整副本的主文件settings.py;然后将DJANGO_SETTINGS_MODULE指向这些文件的Python路径。这里需要注意的是,您必须确保PYTHONPATH已调整为包含您的设置的位置。请参阅SplitSettings wiki entry

+0

感谢Burhan,根据http://djangobook.com/en/2.0/chapter12/下的使用不同的生产设置,它是settings_production.py,从设置导入的设置导入*'你似乎这样做其他方式,不是吗? – Houman 2012-08-06 13:47:44