1

我正在使用 python 设置文件。我有以下结构:

settings
├── base.py
├── __init__.py
├── local.py
├── production.py
└── staging.py

设置模块取自环境变量,例如“settings.production”。这很好用,并替换了旧的不灵活的 settings.py 文件,使我可以很好地组织登台、生产和本地站点的设置。

调用代码中的Asettings = importlib.import_module(os.environ['DJANGO_SETTINGS_MODULE'])会选择我新的灵活设置,就好像它们是很酷的旧模块一样,并且大部分时间都可以使用。

不幸的是,旧的遗留代码,其中有很多,不时调用“导入设置”,这会失败。

我需要“导入设置”完全等同于“导入设置。生产”或环境变量中指定的任何内容,以便在不失去灵活设置配置的好处的情况下支持旧代码。

注意:是的,这是我使用一个古老且非常大的 Django 1.3 站点,但我相信我已经使这个问题独立于 Django。

4

1 回答 1

1

写下这个问题是一种宣泄。这是我的解决方案:

__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.xxxwheresettings.xxx在环境变量 DJANGO_SETTINGS_MODULE 中指定。

我希望其他人觉得这很有用。请注意,只要您使用的应用程序正确导入设置,较新版本的 DJANGO 就不需要这种恶作剧。

于 2013-07-02T06:24:29.503 回答