【问题标题】:Namespaces issue in settings.pysettings.py 中的命名空间问题
【发布时间】:2011-08-03 18:49:22
【问题描述】:

我正在尝试自定义应用程序如何集成到通用 Django 项目中。问题是关于如何将应用程序设置文件导入到项目 settings.py 中,以便将应用程序特定设置与 Django 的设置分开。例如:

settings.py

# Django configuration settings...
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'cms'
}
# a bunch of other settings

# apps overridings and new settings
from settings_myapp import *

settings_myapp.py

from settings import DATABASES

DATABASES['cms'] = {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': 'cms'
}

到目前为止一切顺利。在 Django 设置中的运行时,DATABASE 字典反映了应用程序所做的更改。但是,如果应用想要将 new 名称添加到外部命名空间中怎么办?在myapp_settings 中添加NEW_SETTING = True 并在settings.py 末尾添加一些打印语句,我明白了:

$ python settings.py 
{'default': {'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'default'}}
Traceback (most recent call last):
  File "settings.py", line 8, in <module>
    from settings_myapp import *
  File "~/settings_myapp.py", line 1, in <module>
    from settings import DATABASES
  File "~/settings.py", line 10, in <module>
    print NEW_SETTING
NameError: name 'NEW_SETTING' is not defined

如何避免循环导入并完成工作?

我认为我在这里缺少一些基本的 Python 概念,我还是给出了 Django 上下文,因为我也很欣赏不同的解决方案来达到拆分设置目标。

【问题讨论】:

    标签: python django module namespaces settings


    【解决方案1】:

    这是在 settings 主文件中的 execfile('settings_myapp.py') 实际上可能是一个好主意的情况之一,因为您真正想要做的是在当前上下文中运行一些代码。

    只需从settings_myapp.py 中取出import,它应该可以正常工作。

    编辑:想补充一点,execfile() 已从 Python 3 中删除;使用exec(open(fn).read())

    【讨论】:

    • +1 你的方案有合并命名空间的效果,完美解决了我提出的问题。
    猜你喜欢
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多