[英]How to create a default python submodule for import
我正在使用python設置文件。 我有以下結構:
settings
├── base.py
├── __init__.py
├── local.py
├── production.py
└── staging.py
設置模塊是從環境變量(例如“ settings.production”)中提取的。 這可以很好地工作,並替換了舊的inflexible settings.py文件,使我可以很好地組織登台,生產和本地站點的設置。
調用代碼中的settings = importlib.import_module(os.environ['DJANGO_SETTINGS_MODULE'])
選擇了我的新靈活設置,就好像它們是很酷的舊模塊一樣,並且在大多數情況下都有效。
不幸的是,現在有很多舊的舊代碼,然后不停地調用“導入設置”,這失敗了。
我需要“導入設置”與“ import settings.production”或環境變量中指定的任何內容完全等效,以便支持舊版代碼,而不會失去靈活設置配置的好處。
注意:是的,這是我在一個很大的舊Django 1.3站點上工作,但是我相信我使這個問題獨立於Django。
寫下這個問題是徒勞的。 這是我的解決方案:
在設置模塊的__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
,其中settings.xxx
在環境變量DJANGO_SETTINGS_MODULE中指定。
我希望其他人覺得這很有用。 請注意,只要您使用的應用程序正確導入了設置,DJANGO的較新版本就無需使用此技巧。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.