python环境变量配置_?Python项目读取配置的正确姿势
讀取配置是大部分python應(yīng)用都會(huì)面臨的問題,例如應(yīng)用運(yùn)行時(shí)需要讀取數(shù)據(jù)庫的配置,存儲(chǔ)文件需要知道文件路徑配置,應(yīng)用在不同的環(huán)境的配置也不盡相同。因此,配置管理是一個(gè)必不可少的問題,配置讀取的方式一方面涉及到程序結(jié)構(gòu),一方面涉及到安全。
我們將程序運(yùn)行環(huán)境劃分為開發(fā)、測試、預(yù)發(fā)布和生產(chǎn)環(huán)境,關(guān)于環(huán)境的配置變量為ENV:
ENV = 'dev' #開發(fā)環(huán)境 ENV = 'test' #測試環(huán)境 ENV = 'prehub' #預(yù)發(fā)布環(huán)境 ENV = 'prod' #生產(chǎn)環(huán)境Tips: 配置文件(config.py 或 settings.py) 通常放置在程序源代碼的目錄,方便引用1. 將配置寫在Python文件中(不推薦)
"""那么讀取配置的代碼如下:
import raw_configs as configassert config.DATABASE_CONFIG['host'] == 'localhost' assert config.DATABASE_CONFIG['user'] == 'user' assert config.DATABASE_CONFIG['password'] == 'password' assert config.DATABASE_CONFIG['dbname'] == 'test'當(dāng)需要區(qū)分開發(fā)、測試、預(yù)發(fā)布和生產(chǎn)時(shí),配置就開始變得復(fù)雜,可以將不同環(huán)境的配置寫到不同的類中,參考flask的配置管理方法
""" @file: raw_flask_configs.py """class Config(object):DEBUG = FalseTESTING = FalseDATABASE_URI = 'sqlite://:memory:'class ProdConfig(Config):'''生產(chǎn)環(huán)境配置'''DATABASE_URI = 'mysql://user@localhost/foo'class PrehubConfig(Config):'''預(yù)發(fā)布環(huán)境配置'''DATABASE_URI = 'mysql://user@localhost/foo'class DevelopmentConfig(Config):'''開發(fā)環(huán)境配置'''DEBUG = Trueclass TestingConfig(Config):'''測試環(huán)境配置'''TESTING = True當(dāng)我們在程序初始化運(yùn)行時(shí),可以根據(jù)系統(tǒng)環(huán)境變量來選擇不同的配置
#-*- coding:utf-8 _*- """ @file: raw_main.py """import sysimport flaskimport raw_flask_configs as configif __name__ == '__main__':env = sys.argv[1] if len(sys.argv) > 2 else 'dev'app = flask.Flask(__name__)if env == 'dev':app.config = config.DevelopmentConfigelif env == 'test':app.config = config.TestingConfigelif env == "prehub":app.config = config.ProdConfigelif env == 'prod':app.config = config.ProdConfigelse:raise ValueError('Invalid environment name')這種方法非常簡單,直接把配置的內(nèi)容寫到了代碼中,在應(yīng)用中直接進(jìn)行引用。另外也可以把這個(gè)py配置文件放到其他python應(yīng)用中,修改具體的配置內(nèi)容即可。但是,它存在嚴(yán)重的安全問題,我們都知道不應(yīng)該把配置寫到代碼中,如果有人把我們的源代碼上傳到了github中,那么數(shù)據(jù)庫的配置就相當(dāng)于向全世界公開了。當(dāng)然,當(dāng)配置文件不包含敏感信息時(shí),也可以采用這種簡單的方法。
2. 利用外部配置文件
更常見的配置管理方法就是利用外部的配置文件,讓配置文件僅僅包含配置信息,和代碼獨(dú)立開來,不直接引用也就不需要寫成python代碼。通常使用json、yaml或者ini的文件格式來存儲(chǔ)配置。
# config.ini [DATABASE] HOST = 'localhost' DBNAME = 'test' USER = 'user' PASSWORD = 'password' PORT = 3306 # config.json {"DATABASE": {"host": "localhost","dbname": "test","user": "user","password": "password","port": 3306} }結(jié)合環(huán)境變量和python庫configparser讀取外部文件,首先在開發(fā)通常不會(huì)接觸到生產(chǎn)環(huán)境,因此生產(chǎn)環(huán)境的配置文件由運(yùn)維來寫,運(yùn)維將應(yīng)用所需要的配置寫好后,放到生產(chǎn)服務(wù)器的指定位置,代碼從指定位置讀取配置。為了方便程序的統(tǒng)一調(diào)試,可以提前約定好一個(gè)系統(tǒng)環(huán)境變量(CONFIG_PATH)來指定配置文件的存放路徑。
export CONFIG_PATH = /home/test/configs/app_config.ini讀取的代碼如下:
""" @file: read_config_from_file.py """ import os import configparsertry:CONFIG_PATH = os.environ['CONFIG_PATH'] except Exception:raise ValueErrorconfig = configparser.ConfigParser() config.read(CONFIG_PATH)host = config["DATABASE"]["HOST"]直接使用系統(tǒng)環(huán)境變量讀取配置
此方法不使用文件來存儲(chǔ)配置信息,將所有的配置信息存儲(chǔ)到環(huán)境變量中,在實(shí)踐中也比較常見,運(yùn)維通過ansible部署腳本,在程序運(yùn)行前將需要配置信息導(dǎo)入到環(huán)境變量中。
import ossecret_key = os.environ.get('SECRET_KEY', None)if not secret_key:raise ValueError('You must have "SECRET_KEY" variable')app.config['SECRET_KEY'] = secert_key不利用文件存儲(chǔ),在一定程度上加強(qiáng)了對密碼等配置信息的保護(hù),但也增加了運(yùn)維的工作量,尤其當(dāng)需要修改配置的時(shí)候。
3. Dynaconf:Pyhton項(xiàng)目的動(dòng)態(tài)配置
上面介紹了三種常見的項(xiàng)目配置方法,最有介紹一個(gè)好用的python動(dòng)態(tài)項(xiàng)目配置庫:Dynaconf。dyanconf是OSM(Object Settings Mapper), 能夠從不同的配置數(shù)據(jù)存儲(chǔ)方式中讀取配置,例如python配置文件、系統(tǒng)環(huán)境變量、redis、ini文件、json文件等等。
安裝:pip install dynaconf使用方式:
from dynaconf import settings print settings.SOME_VARIABLE or print settings.get('SOME_VARIABLE')默認(rèn)情況下,dyanconf從項(xiàng)目根目錄下的settings.py文件中讀取配置,并且所有的大寫變量將會(huì)被讀取如果不希望配置跟隨項(xiàng)目,可以通過系統(tǒng)環(huán)境變量來指定配置文件的位置
# using module name export DYNACONF_SETTINGS=myproject.production_settings # or using location path export DYNACONF_SETTINGS=/etc/myprogram/settings.py3.1 dyanconf讀取系統(tǒng)環(huán)境變量中的配置
當(dāng)我們部署的程序需要讀取一個(gè)MYSQL_HOST的配置用于測試,不需要去重寫配置文件,僅需要再系統(tǒng)環(huán)境變量中加入:
export DYNACONF_MYSQL_HOST=myserver.com然后,程序便可以獲取到該配置:
>>> from dynaconf import settings >>> print(settings.MYSQL_HOST) myserver.com如果需要指定配置值的數(shù)值類型,則通過以下方式增加對應(yīng)的系統(tǒng)環(huán)境變量:
export DYNACONF_NUMBER='@int 123' export DYNACONF_FLOAT='@float 12.2' export DYNACONF_FLAG='@bool yes' export DYNACONF_FLAG2='@bool disabled' export DYNACONF_LIST='@json [1, 2, 3, 4]' export DYNACONF_DICT='@json {"name": "Bruno"}'讀取到的配置如下所示:
from dynaconf import settingstype(settings.NUMBER) inttype(settings.FLOAT) floattype(settings.FLAG) boolprint settings.FLAG2 == False Trueprint settings.LIST[1] 2print settings.DICT['name'] Bruno3.2 通過redis存儲(chǔ)配置
我們也可以講配置文件存儲(chǔ)到redis中,達(dá)到在對不同的機(jī)器共享環(huán)境變量的效果,僅需要在settings.py文件中增加一下代碼:
# connection REDIS_FOR_DYNACONF = {'host': 'localhost','port': 6379,'db': 0 }# and loader LOADERS_FOR_DYNACONF = ['dynaconf.loaders.env_loader','dynaconf.loaders.redis_loader' # 增加了redis的加載 ]現(xiàn)在可以講配置存儲(chǔ)到redis中,hash默認(rèn)為DYNACONF_DYNACONF。dyanconf還提供了方法去將配置寫入到redis:
from dynaconf.utils import redis_writer from dynaconf import settingsredis_writer.write(settings,name='test',mysql_host='localhost', MYSQL_PORT=3306)查看Redis,存儲(chǔ)的結(jié)果如下:
DYNACONF_DYNACONF:NAME='test'MYSQL_HOST='localhost'PORT='@int 3306'至此,python項(xiàng)目常見的配置方法總結(jié)完畢,不過在一些微服務(wù)架構(gòu)中,會(huì)專門開發(fā)配置中心,程序直接從線上讀取配置,配置的管理也會(huì)開發(fā)一套GUI,方便開發(fā)和運(yùn)維。
總結(jié)
以上是生活随笔為你收集整理的python环境变量配置_?Python项目读取配置的正确姿势的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win10共享打印机怎么设置_小编为你叙
- 下一篇: python 3.7.5下载_you-g