settings.py中的命名空间问题

时间:2011-08-03 18:49:22

标签: python django module namespaces settings

我正在尝试自定义应用程序如何集成到通用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 名称,该怎么办?在NEW_SETTING = True中添加myapp_settings以及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上下文,因为我也很欣赏不同的解决方案来达到分割设置目标。

1 个答案:

答案 0 :(得分:1)

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

import中取出settings_myapp.py,它应该可以正常使用。

编辑:想要添加已从Python 3中删除execfile();使用exec(open(fn).read())