代码之家  ›  专栏  ›  技术社区  ›  Jiaaro

我可以访问本地作用域的\u dict \对象吗?

  •  0
  • Jiaaro  · 技术社区  · 15 年前

    这是我的情况…

    我正试图在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']), )
    

    所以我的问题是…如何将内容添加到设置文件的范围中?好像没有 双关语 对象可用于其中的变量。

    也许我这一切都错了?谢谢你的帮助!

    PS-我对 global 关键字是它告诉编译器函数意味着操作全局变量 在它自己的文件中 -对于函数调用的文件是否有这样的内容?

    2 回复  |  直到 15 年前
        1
  •  3
  •   Cat Plus Plus    15 年前

    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']),)
    
        2
  •  3
  •   Community CDub    7 年前

    您可能希望了解人们过去配置许多django站点而不重复的各种方案: How to manage local vs production settings in Django? Elegantly handle site-specific settings/configuration in svn/hg/git/etc?