2

我正在将 Google App Engine 应用程序从 Django 0.96 迁移到 1.2。在此过程中,我注意到我在主处理程序中指定的设置文件不再加载(而不是 3 种指定语言,Django 从其django/conf/global_settings.py文件中加载了默认语言的完整列表)。

在 0.96 中,我指定了这样的文件:

import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'conf.settings'

根据我在文档中读到的内容,这不应该改变。但是,当像这样指定版本 1.2 时:

from google.appengine.dist import use_library
use_library('django', '1.2')

conf.settings不再进口。在 GAE 的 SDK 中挖掘了一下,我注意到google_appengine/lib/django_<VERS>/django/conf/__init__.py文件的 0.96 和 1.2 版本的工作方式不同。

在 0.96 中,LazySettings._import_settings被调用 from LazySettings.__getattr__,这将导致在 中指定的文件os.environ['DJANGO_SETTINGS_MODULE']被导入。

在 1.2 中,LazySettings._setup似乎没有在任何地方调用。

如果我在主处理程序中添加手动调用settings._setup(),自定义设置文件将正确导入。像这样:

from django.conf import settings
settings._target = None # Force Django to reload settings
settings._setup()

但是,必须手动调用该私有函数感觉很奇怪/错误……为什么我的自定义设置文件不再导入?

4

1 回答 1

2

这里有一个很好的解释:

Django 设置是从指定的 settings.py 延迟加载的,在它们第一次被访问时。问题是导入 webapp.template 调用 django.conf.settings.configure() 来尝试设置一些设置。因此,如果 webapp.template 在访问任何设置之前被导入,那么 settings.py 永远不会加载(因为设置访问器发现设置已经存在,并且不再尝试加载)。

对此的解决方案是在导入 webapp.template 之前强制访问设置,加载 settings.py。然后当 webapp.template 稍后被导入时,它对 django.conf.settings.configure() 的调用被忽略。

对我来说听起来像是一个错误。您可以将其提交给问题跟踪器

于 2011-05-01T01:45:51.843 回答