Django有时忽略我的DATABASE_ENGINE设置

-4 投票
1 回答
1019 浏览
提问于 2025-04-15 15:27

我有几个网站,每个网站都有不同的设置文件和名称。这些设置文件的主题都是花卉风格。我们必须把这些网站分开管理。

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 中,PYTHONPATHC:\Proj-Carnation;C:\Proj-Root;C:\This;C:\That

而在工作的根项目 C:\Proj-Carnation 中,PYTHONPATHC:\Proj-Root;C:\This;C:\That

我是不是在“Carnation”项目中找到了什么,导致根项目的某些东西被隐藏了?可惜的是,Carnation项目只有几个文件,而且它们在一个包(local)中,确保它们的名称与根项目不同。

在1.1.1版本的Django中,有没有什么初始化的地方不同?比如,django.conf 中是否有什么与Python 2.6和Django 1.1.1不兼容的地方?

我是不是忽略了什么相对导入的问题?

1 个回答

10

找到了。

当你的设置模块放在一个包里面时,那个包最上层的 __init__.py 文件不能导入任何Django的内容。

如果包含你设置的顶层 __init__.py 文件里有Django的导入,那么这个导入可能会在你的设置创建之前就使用默认的设置。

而且因为Django里有些东西(比如数据库连接)是单例的,所以在读取你的设置时创建的那个东西将是唯一存在的。

不要在包含设置模块的包的 __init__.py 文件里放任何东西。

撰写回答