DJANGO_SETTINGS_MODULE - указанный файл настроек не загружен?

Я мигрирую приложение 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, я заметил, что версии 0.96 и 1.2 файла google_appengine/lib/django_<VERS>/django/conf/__init__.py работают по-разному.

В версии 0.96 LazySettings._import_settings вызывается из 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()

Однако мне кажется странным/неправильным вызывать эту приватную функцию вручную... Почему мой файл пользовательских настроек больше не импортируется?


person Emilien    schedule 01.05.2011    source источник


Ответы (1)


Хорошее объяснение того, что происходит здесь:

Настройки Django загружаются из указанного settings.py лениво, при первом доступе к ним. Проблема в том, что импорт webapp.template вызывает django.conf.settings.configure(), чтобы попытаться настроить некоторые параметры. Поэтому, если webapp.template импортируется до доступа к каким-либо настройкам, то settings.py никогда не загружается (поскольку средство доступа к настройкам обнаруживает, что настройки уже существуют, и больше не пытается их загружать).

Решение этой проблемы состоит в том, чтобы принудительно получить доступ к настройкам, чтобы загрузить settings.py до того, как будет импортирован webapp.template. Затем, когда webapp.template позже импортируется, его вызов django.conf.settings.configure() игнорируется.

Звучит как ошибка для меня. Вы можете отправить его в систему отслеживания ошибок.

person Drew Sears    schedule 01.05.2011
comment
Действительно, перемещение импорта настроек перед импортом веб-приложения решило эту проблему. Я открою вопрос, чтобы сообщить об этом. Спасибо. - person Emilien; 01.05.2011