我正在使用python设置文件。我有以下结构:
settings
├── base.py
├── __init__.py
├── local.py
├── production.py
└── staging.py
设置模块从环境变量中获取,例如'settings.production'。这样可以正常工作并替换旧的不灵活的settings.py文件,这样我就可以很好地组织分段,生产和本地站点的设置。
调用代码中的settings = importlib.import_module(os.environ['DJANGO_SETTINGS_MODULE'])
会选择我的新灵活设置,就好像它们是旧模块一样很酷并且大部分时间都能正常工作。
不幸的是,旧的遗留代码,其中有很多,现在然后调用“导入设置”,这就失败了。
我需要'import settings'完全等同于'import settings.production',或者环境变量中指定的任何内容,以便支持遗留代码而不会失去灵活设置配置的好处。
注意:是的,这是我使用的是一个古老而又非常大的Django 1.3网站,但我相信我已经将这个问题独立于Django了。
答案 0 :(得分:0)
写这个问题是一种宣泄。这是我的解决方案:
在我设置的__init__.py
设置模块中:
import os
import importlib
try:
# Do a dynamic 'from DJANGO_SETTINGS_MODULE import *'
settings = importlib.import_module(os.environ['DJANGO_SETTINGS_MODULE'])
for v in dir(settings):
if v.startswith("__"): continue
globals()[v] = getattr(settings, v)
except ImportError, KeyError:
# default to the production settings if environment variable not set or improperly specified
from production import *
这确实做了一些额外的工作,但它很好地解决了这个问题。现在我的遗留程序获得了所需的设置。
实质上,这会使import settings == import settings.xxx
在环境变量DJANGO_SETTINGS_MODULE中指定settings.xxx
。
我希望其他人觉得这很有用。请注意,只要你使用的应用程序正确导入设置,DJANGO的新版本就不需要这个恶作剧。