1
2
3
4
5
6
7
8
9
10
11
12
import os
import configparser
try:
CONFIG_PATH= os.environ['CONFIG_PATH']
except Exception:
raise ValueError
config= configparser.ConfigParser()
config.read(CONFIG_PATH)
host= config["DATABASE"]["HOST"]
3. 直接使用系统环境变量读取配置
此方法不使用文件来存储配置信息,将所有的配置信息存储到环境变量中,在实践中也比较常见,运维通过ansible部署脚本,在程序运行前将需要配置信息导入到环境变量中。
1
2
3
4
5
6
7
8
import os
secret_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
不利用文件存储,在一定程度上加强了对密码等配置信息的保护,但也增加了运维的工作量,尤其当需要修改配置的时候。
4. Dynaconf:Pyhton项目的动态配置
上面介绍了三种常见的项目配置方法,最有介绍一个好用的python动态项目配置库:Dynaconf。dyanconf是OSM(Object Settings Mapper), 能够从不同的配置数据存储方式中读取配置,例如python配置文件、系统环境变量、redis、ini文件、json文件等等。
安装:pip install dynaconf
使用方式:
1
2
3
4
from dynaconfimport settings
print(settings.SOME_VARIABLE)
or
print(settings.get('SOME_VARIABLE'))
如果不希望配置跟随项目,可以通过系统环境变量来指定配置文件的位置
1
2
3
4
# using module name
export DYNACONF_SETTINGS=myproject.production_settings
# or using location path
export DYNACONF_SETTINGS=/etc/myprogram/settings.py
4.1 dyanconf读取系统环境变量中的配置
当我们部署的程序需要读取一个MYSQL_HOST的配置用于测试,不需要去重写配置文件,仅需要再系统环境变量中加入:
export DYNACONF_MYSQL_HOST=myserver.com
然后,程序便可以获取到该配置:
>>> from dynaconf import settings
>>> print(settings.MYSQL_HOST)
myserver.com
如果需要指定配置值的数值类型,则通过以下方式增加对应的系统环境变量:
1
2
3
4
5
6
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"}'
读取到的配置如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from dynaconfimport settings
type(settings.NUMBER)
int
type(settings.FLOAT)
float
type(settings.FLAG)
bool
print(settings.FLAG2== False)
True
print(settings.LIST[1])
2
print(settings.DICT['name'])
Bruno
4.2 通过redis存储配置
我们也可以讲配置文件存储到redis中,达到在对不同的机器共享环境变量的效果,仅需要在settings.py文件中增加一下代码:
1
2
3
4
5
6
7
8
9
10
11
12
# connection
REDIS_FOR_DYNACONF= {
'host':'localhost',
'port':6379,
'db':0
}
# and loader
LOADERS_FOR_DYNACONF= [
'dynaconf.loaders.env_loader',
'dynaconf.loaders.redis_loader' # 增加了redis的加载
]
现在可以讲配置存储到redis中,hash默认为DYNACONF_DYNACONF。dyanconf还提供了方法去将配置写入到redis:
1
2
3
4
from dynaconf.utilsimport redis_writer
from dynaconfimport settings
redis_writer.write(settings,name='test',mysql_host='localhost', MYSQL_PORT=3306)
查看Redis,存储的结果如下:
1
2
3
4
DYNACONF_DYNACONF:
NAME='test'
MYSQL_HOST='localhost'
PORT='@int 3306'
至此,python项目常见的配置方法总结完毕,不过在一些微服务架构中,会专门开发配置中心,程序直接从线上读取配置,配置的管理也会开发一套GUI,方便开发和运维。