这是我的情况......
我想在django网站上的settings.py文件中动态生成一堆东西。
我正在设置多个站点(通过站点框架),我希望将一些值插入到一个函数中,该函数将为每个站点生成一部分设置文件。
例如:
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), )
显然,对于运行此代码的每个站点,在设置文件中包含最后3行是严重违反DRY的。所以我想做这样的事情
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
关键字的理解是它告诉编译器该函数意味着在它自己的文件中操纵全局变量 - 文件是否有这样的东西?哪个函数被调用?
答案 0 :(得分:3)
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']),)
答案 1 :(得分:3)
您可能希望了解人们用于配置多个django网站而不重复的各种方案:How to manage local vs production settings in Django?和Elegantly handle site-specific settings/configuration in svn/hg/git/etc?