【问题标题】:Can I access the __dict__ object for the local scope?我可以访问本地范围的 __dict__ 对象吗?
【发布时间】:2010-12-11 22:45:04
【问题描述】:

这是我的情况……

我正在尝试在 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 关键字的理解是,它告诉编译器该函数意味着在 在它自己的文件中操作全局变量 - 文件中是否存在这样的东西函数被调用了吗?

【问题讨论】:

    标签: python django scope settings


    【解决方案1】:

    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']),)
    

    【讨论】:

    • 我正在考虑这个问题,但我试图在它上面使用 setattr ......我想那是我的愚蠢。谢谢,这比我想做的要好得多:)
    • 实际上,locals() 的文档说:“警告:不应修改此字典的内容;更改可能不会影响解释器使用的局部变量的值。”
    【解决方案2】:

    您可能想查看人们用来配置许多 django 站点而不会重复的各种方案:How to manage local vs production settings in Django?Elegantly handle site-specific settings/configuration in svn/hg/git/etc?

    【讨论】:

    • 我实际上有一个很好的方法来管理框之间的差异 - 我只是想使用简单的字符串连接以编程方式将一组设置应用于每个设置文件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多