Django有时忽略我的DATABASE_ENGINE设置
我有几个网站,每个网站都有不同的设置文件和名称。这些设置文件的主题都是花卉风格。我们必须把这些网站分开管理。
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'
。
在另一个项目(“根”项目)中,没有任何问题。一切运行得很顺利。数据库设置创建了正确的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不兼容的地方?
我是不是忽略了什么相对导入的问题?
1 个回答
找到了。
当你的设置模块放在一个包里面时,那个包最上层的 __init__.py
文件不能导入任何Django的内容。
如果包含你设置的顶层 __init__.py
文件里有Django的导入,那么这个导入可能会在你的设置创建之前就使用默认的设置。
而且因为Django里有些东西(比如数据库连接)是单例的,所以在读取你的设置时创建的那个东西将是唯一存在的。
不要在包含设置模块的包的 __init__.py
文件里放任何东西。