我有几个网站,每个网站都有一个不同的设置文件 - 并且名称不同。所有变体设置都有花卉主题。我们必须将网站分开。
C:\Proj-Carnation> echo %DJANGO_SETTINGS_MODULE%
path.to.settings_carnation_win32
我们有许多不使用内置django-admin.py test
命令的测试程序,因为它们是由Django前端启动的大型批处理作业,并使用Django ORM。我们需要使用django.db.connection.creation.create_test_db()
方法来创建一个新的测试数据库。
我们一直在使用这个测试程序。目前,它已停止工作。我们已经进行了大量的代码结构更改,升级到Django 1.1.1和Python 2.6。所有都是罪魁祸首。
当我运行Python时,我看到了这一点。
C:\Proj-Carnation> python
Python 2.6.2 (r262:71605, Apr 14 2009, 22:40:02) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from django.conf import settings
>>> settings.DATABASE_ENGINE
INSDIE django.db.__init__, settings.DATABASE_ENGINE=''
'sqlite3'
>>> import django.db
>>> django.db.connection
<django.db.backends.dummy.base.DatabaseWrapper object at 0x00EE88B0>
在导入django.db
期间,某些设置显然未设置。我在django.db
中添加了一个打印声明(拼写错误的“INSIDE”)。设置未设置。
最终,settings.DATABASE_ENGINE
变为'sqlite3'
。在某种程度上,这种“最终”行为是预期的:settings
模块使用延迟加载器技术。
问题是:连接 - 根据不完整的设置构建 - 是dummy
数据库后端。然而,最终设置显示引擎为'sqlite3'
。
在另一个项目(“Root”项目)中,没有问题。事情很完美。数据库设置创建正确的sqlite3后端实例。
那么,有什么不同?我很难过。这是环境设置或物理目录树是最重要的潜在问题。
在不起作用的C:\Proj-Carnation
中,PYTHONPATH
为C:\Proj-Carnation;C:\Proj-Root;C:\This;C:\That
。
在工作根项目C:\Proj-Carnation
中,PYTHONPATH
为C:\Proj-Root;C:\This;C:\That
。
我是否在“Carnation”项目中寻找隐藏了根项目内容的内容?遗憾的是,Carnation项目只有一些文件,它们位于一个包(local
)中,以确保它们的名称与根项目不同。
1.1.1版中是否有一些Django初始化不同?例如,django.conf
中是否存在与Python 2.6和Django 1.1.1不相符的内容?
是否存在一些我忽略的相对进口问题?
答案 0 :(得分:9)
找到它。
当您的设置模块位于包内时,该包的顶级__init__.py
成员无法导入任何类型的任何Django材料。
如果包含您的设置的顶级__init__.py
具有Django导入,则Django导入将(可能)在创建设置之前使用默认设置。
由于Django中的某些东西(如数据库连接)是单例,因此在读取设置时创建的东西是唯一可以存在的东西。
请勿在包含设置模块的包中的__init__.py
中放置任何内容。