2009-10-31 51 views
0

这是我的情况...我可以访问本地作用域的__dict__对象吗?

我想在django网站的settings.py文件中动态生成一堆东西。

我设置了几个站点(通过站点框架),我想要插入一些值,以便为每个站点生成一部分设置文件。

例如:

from universal_settings import * 

SITE_NAME = 'First Site' 
SITE_SLUG = 'firstsite' 

DEFAULT_FROM_EMAIL = '%s <[email protected]>' % SITE_NAME 
ROOT_URLCONF = 'mysite.urls.%s' % SITE_SLUG 
TEMPLATE_DIRS += (os.path.join(PROJECT_ROOT, "templates", SITE_SLUG),) 

显然是干一个巨大的冲突有那些最后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 <[email protected]>' % 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']),) 

所以我的问题是...我怎么添加东西的设置文件的范围是什么?它似乎没有一个对象可用于其中的变量。

也许我正在谈论这一切都是错误的?谢谢你的帮助!

PS - 我的global关键字的理解是,它告诉功能装置来操作它自己的文件内的全局变量编译器 - 是有文件这样的事情该函数被调用?

回答

3

快译通返回由locals()(或globals())是可变的,所以你可以这样做:

def get_dynamic_settings(context_dict): 
    context_dict['DEFAULT_FROM_EMAIL'] = '%s <[email protected]>' % 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']),) 
+0

我在想那个,但是我想对它使用setattr ......我想那是我的愚蠢。感谢这比我试图做的更好:) – Jiaaro 2009-10-31 20:57:15

+5

其实,本地人()的文档说:“警告:该字典的内容不应该被修改;更改可能不会影响本地变量的值使用翻译“。 – 2009-10-31 21:17:54

相关问题