Проблема с пространствами имен в settings.py - PullRequest
0 голосов
/ 03 августа 2011

Я пытаюсь настроить, как приложения интегрируются в общий проект Django. Вопрос в том, как импортировать файлы настроек приложений в проект settings.py, чтобы отделить специфичные настройки приложений от Django. Например:

settings.py

# Django configuration settings...
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'cms'
}
# a bunch of other settings

# apps overridings and new settings
from settings_myapp import *

settings_myapp.py

from settings import DATABASES

DATABASES['cms'] = {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': 'cms'
}

Пока все хорошо. Во время выполнения в настройках Django словарь DATABASE отражает изменения, внесенные приложением. Но что, если приложение хочет добавить имя new во внешнее пространство имен? Добавив NEW_SETTING = True в myapp_settings и пару операторов печати в конце settings.py, я получаю это:

$ python settings.py 
{'default': {'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'default'}}
Traceback (most recent call last):
  File "settings.py", line 8, in <module>
    from settings_myapp import *
  File "~/settings_myapp.py", line 1, in <module>
    from settings import DATABASES
  File "~/settings.py", line 10, in <module>
    print NEW_SETTING
NameError: name 'NEW_SETTING' is not defined

Как мне избежать кругового импорта и добиться цели?

Я думаю, что мне не хватает некоторой базовой концепции Python, я все равно дал контекст Django, потому что я также был бы признателен за различные решения для достижения цели с разделенными настройками.

1 Ответ

1 голос
/ 03 августа 2011

Это один из тех случаев, когда execfile('settings_myapp.py') в основном файле settings может быть хорошей идеей, поскольку на самом деле вы хотите запустить некоторый код в текущем контексте.

Просто возьмите import из settings_myapp.py и все должно работать нормально.

Редактировать: хотел добавить, что execfile() было удалено из Python 3; используйте exec(open(fn).read()).

...