Могу ли я получить доступ к объекту __dict__ для локальной области видимости? - PullRequest
0 голосов
/ 31 октября 2009

Вот моя ситуация ...

Я пытаюсь динамически сгенерировать кучу вещей в моем файле settings.py на сайте django.

Я настраиваю несколько сайтов (через каркас сайтов) и хочу иметь некоторые значения, которые я подключаю к функции, которая будет генерировать часть файла настроек для каждого сайта.

например:

from universal_settings import *

SITE_NAME = 'First Site'
SITE_SLUG = 'firstsite'

DEFAULT_FROM_EMAIL = '%s <noreply@otakupride.com>' % SITE_NAME
ROOT_URLCONF = 'mysite.urls.%s' % SITE_SLUG
TEMPLATE_DIRS += ( os.path.join(PROJECT_ROOT, "templates", SITE_SLUG), )

очевидно, что DRY - это огромное нарушение того, что последние 3 строки в файле настроек для каждого сайта, на котором запущен этот код. Поэтому я хочу сделать что-то вроде этого

from universal_settings import *
from utils import get_dynamic_settings

SITE_NAME = 'First Site'
SITE_SLUG = 'firstsite'

get_dynamic_settings( locals() )

А вот и функция

# WARNING: THIS CODE DOES NOT WORK!
def get_dynamic_settings(context_dict):
    global DEFAULT_FROM_EMAIL
    global ROOT_URLCONF
    global TEMPLATE_DIRS

    DEFAULT_FROM_EMAIL = '%s <noreply@otakupride.com>' % context_dict['SITE_NAME']
    ROOT_URLCONF = 'mysite.urls.%s' % context_dict['SITE_SLUG']
    TEMPLATE_DIRS += ( os.path.join(PROJECT_ROOT, "templates", context_dict['SITE_SLUG']), )

так что мой вопрос ... как мне добавить вещи в область файла настроек? Похоже, в нем нет объекта dict , доступного для переменных внутри него.

Может быть, я все об этом ошибаюсь? Спасибо за вашу помощь!

PS - мое понимание ключевого слова global заключается в том, что он сообщает компилятору, что функция означает манипулирование глобальной переменной в ее собственном файле - существует ли такая вещь для файла, которую функция называется?

Ответы [ 2 ]

3 голосов
/ 31 октября 2009

Возможно, вы захотите изучить различные схемы, которые люди использовали для настройки многих сайтов django без дублирования: Как управлять локальными и производственными настройками в Django? и Элегантно обрабатывать специфичные для сайта настройки / конфигурация в svn / hg / git / etc?

3 голосов
/ 31 октября 2009

Dict, возвращаемый locals() (или globals()), является изменяемым, поэтому вы можете сделать:

def get_dynamic_settings(context_dict):
    context_dict['DEFAULT_FROM_EMAIL'] = '%s <noreply@otakupride.com>' % context_dict['SITE_NAME']
    context_dict['ROOT_URLCONF'] = 'mysite.urls.%s' % context_dict['SITE_SLUG']
    context_dict['TEMPLATE_DIRS'] += (os.path.join(PROJECT_ROOT, "templates", context_dict['SITE_SLUG']),)
...