項(xiàng)目里有一些配置信息入问,是以模塊參數(shù)的形式存在的(形如django的settings.py)爬泥。因?yàn)殚_發(fā)環(huán)境和生產(chǎn)環(huán)境的區(qū)別漱抓,這些配置信息也有區(qū)別童番。如果每次發(fā)布時(shí)都要手動(dòng)地將這些配置信息修改成生產(chǎn)環(huán)境的內(nèi)容精钮,然后再發(fā)布,很容易出問題妓盲,能不能通過一種方式杂拨,讓項(xiàng)目能自動(dòng)識(shí)別當(dāng)前的環(huán)境,獲取正確的參數(shù)呢悯衬?弹沽?
首先,將配置文件拆分成四個(gè)筋粗,統(tǒng)一放在一個(gè)package下:
見名知意策橘,大部分的配置都放在base.py里。對(duì)于不同環(huán)境要有不同配置的參數(shù)娜亿,要放到相應(yīng)的develop.py丽已、pilot.py或production.py中,后面三個(gè)的配置信息會(huì)覆蓋掉base.py的信息买决。
接下來的工作有兩項(xiàng):A 讓系統(tǒng)得知自己當(dāng)前所處的環(huán)境 B 將對(duì)應(yīng)的python模塊中的參數(shù)讀取出來沛婴,注入到package中吼畏。
對(duì)于A,很簡(jiǎn)單嘁灯,使用socket.gethostname()獲取當(dāng)前主機(jī)名即可泻蚊。
難點(diǎn)在于B。分兩步: 讀取模塊中的參數(shù)丑婿;注入到package中性雄。
做法如下: 在app_settings.init中:
import socket
from loguru import logger
import traceback
import importlib
from .base import *
host_name = socket.gethostname().upper()
try:
# 獲取模塊參數(shù)
if host_name.startswith("POR"):
logger.debug("### POR ENV ###")
settings = importlib.import_module('config.app_settings.production')
elif host_name.startswith("PILOT"):
logger.debug("### PILOT ENV ###")
settings = importlib.import_module('config.app_settings.pilot')
else:
logger.debug("### DEVELOP ENV ###")
settings = importlib.import_module('config.app_settings.develop')
# 參數(shù)注入。注意跳過內(nèi)置參數(shù)(以_開頭)
for param in dir(settings):
if param.startswith("_"):
pass
else:
globals()[param] = getattr(settings, param)
except Exception as e:
err_msg = "Error happened during handle config items in init of app_settings: " + str(e)
logger.error(err_msg)
logger.error(traceback.format_exc())
如何在項(xiàng)目的其他位置使用參數(shù):先引入from config import app_settings
羹奉,然后通過app_settings.XXX來獲取參數(shù)值秒旋。
測(cè)試:
base.py:
AAA = 'baseAAA'
develop.py:
AAA = "developAAA"
項(xiàng)目的其他位置:
from config import app_settings
# ...
print(app_settings.AAA)
結(jié)果: