读取配置是大部分python应用都会面临的问题,例如应用运行时需要读取数据库的配置,存储文件需要知道文件路径配置,应用在不同的环境的配置也不尽相同。因此,配置管理是一个必不可少的问题,配置读取的方式一方面涉及到程序结构,一方面涉及到安全。

我们将程序运行环境划分为开发、测试、预发布和生产环境,关于环境的配置变量为ENV:

ENV = 'dev' #开发环境
ENV = 'test' #测试环境
ENV = 'prehub' #预发布环境
ENV = 'prod' #生产环境

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'

当需要区分开发、测试、预发布和生产时,配置就开始变得复杂,可以将不同环境的配置写到不同的类中,参考flask的配置管理方法

"""
@file: raw_flask_configs.py
"""class Config(object):DEBUG = FalseTESTING = FalseDATABASE_URI = 'sqlite://:memory:'class ProdConfig(Config):'''生产环境配置'''DATABASE_URI = 'mysql://user@localhost/foo'class PrehubConfig(Config):'''预发布环境配置'''DATABASE_URI = 'mysql://user@localhost/foo'class DevelopmentConfig(Config):'''开发环境配置'''DEBUG = Trueclass TestingConfig(Config):'''测试环境配置'''TESTING = True

当我们在程序初始化运行时,可以根据系统环境变量来选择不同的配置

#-*- 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')

这种方法非常简单,直接把配置的内容写到了代码中,在应用中直接进行引用。另外也可以把这个py配置文件放到其他python应用中,修改具体的配置内容即可。但是,它存在严重的安全问题,我们都知道不应该把配置写到代码中,如果有人把我们的源代码上传到了github中,那么数据库的配置就相当于向全世界公开了。当然,当配置文件不包含敏感信息时,也可以采用这种简单的方法

2. 利用外部配置文件

更常见的配置管理方法就是利用外部的配置文件,让配置文件仅仅包含配置信息,和代码独立开来,不直接引用也就不需要写成python代码。通常使用json、yaml或者ini的文件格式来存储配置。

# 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}
}

结合环境变量和python库configparser读取外部文件,首先在开发通常不会接触到生产环境,因此生产环境的配置文件由运维来写,运维将应用所需要的配置写好后,放到生产服务器的指定位置,代码从指定位置读取配置。为了方便程序的统一调试,可以提前约定好一个系统环境变量(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"]

直接使用系统环境变量读取配置

此方法不使用文件来存储配置信息,将所有的配置信息存储到环境变量中,在实践中也比较常见,运维通过ansible部署脚本,在程序运行前将需要配置信息导入到环境变量中。

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

不利用文件存储,在一定程度上加强了对密码等配置信息的保护,但也增加了运维的工作量,尤其当需要修改配置的时候。

3. Dynaconf:Pyhton项目的动态配置

上面介绍了三种常见的项目配置方法,最有介绍一个好用的python动态项目配置库:Dynaconf。dyanconf是OSM(Object Settings Mapper), 能够从不同的配置数据存储方式中读取配置,例如python配置文件、系统环境变量、redis、ini文件、json文件等等。

安装:pip install dynaconf

使用方式:

from dynaconf import settings
print settings.SOME_VARIABLE
or
print settings.get('SOME_VARIABLE')

默认情况下,dyanconf从项目根目录下的settings.py文件中读取配置,并且所有的大写变量将会被读取

如果不希望配置跟随项目,可以通过系统环境变量来指定配置文件的位置

# using module name
export DYNACONF_SETTINGS=myproject.production_settings
# or using location path
export DYNACONF_SETTINGS=/etc/myprogram/settings.py

3.1 dyanconf读取系统环境变量中的配置

当我们部署的程序需要读取一个MYSQL_HOST的配置用于测试,不需要去重写配置文件,仅需要再系统环境变量中加入:

export DYNACONF_MYSQL_HOST=myserver.com

然后,程序便可以获取到该配置:

>>> from dynaconf import settings
>>> print(settings.MYSQL_HOST)
myserver.com

如果需要指定配置值的数值类型,则通过以下方式增加对应的系统环境变量:

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']
Bruno

3.2 通过redis存储配置

我们也可以讲配置文件存储到redis中,达到在对不同的机器共享环境变量的效果,仅需要在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的加载
]

现在可以讲配置存储到redis中,hash默认为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,存储的结果如下:

DYNACONF_DYNACONF:NAME='test'MYSQL_HOST='localhost'PORT='@int 3306'

至此,python项目常见的配置方法总结完毕,不过在一些微服务架构中,会专门开发配置中心,程序直接从线上读取配置,配置的管理也会开发一套GUI,方便开发和运维。

python环境变量配置_?Python项目读取配置的正确姿势相关推荐

  1. 把python37添加到环境变量配置_linux设置python环境变量 分类: python ...

    添加环境变量主要是在/etc/profile中 例如,在/usr/local/下安装了python2.7 因为系统默认是2.4,所以 #python Python 2.4.3 (#1, Sep 3 2 ...

  2. python的安装目录配置到环境变量的path当中_【转】python 环境变量配置

    2011-01-24 12:50 今天第一次做svm实验,按照pdf上的步骤一步一步来,结果在命令行中说提示"python不是内部或外部命令",师兄告诉我说没配置 python环境 ...

  3. python环境变量的运用_Windows下python环境变量配置

    默认情况下,在windows下安装python之后,系统并不会自动添加相应的环境变量.此时不能在命令行直接使用python命令. 1. 首先需要在系统中注册python环境变量:假设python的安装 ...

  4. python38环境变量的配置_Windows下python环境变量配置

    默认情况下,在windows下安装python之后,系统并不会自动添加相应的环境变量.此时不能在命令行直接使用python命令. 1. 首先需要在系统中注册python环境变量:假设python的安装 ...

  5. python环境变量

    核心提示:默认情况下,在windows下安装python之后,系统并不会自动添加相应的环境变量.此时不能在命令行直接使用python命令. 默认情况下,在windows下安装python之后,系统并不 ...

  6. python环境变量配置步骤_关于人工智能Python系统环境变量设置步骤

    最近无论是JAVA的环境变量配置,还是Python环境变量配置都有学生问我,我在这里写一下回答,当然我以配置Python的环境变脸来举例.首先需要确定本机电脑上安装上了Python 首先解释一下为什么 ...

  7. python在d盘增加环境变量配置_怎样配置Python环境变量

    展开全部 第一步:制 找到你的python安装的目录 比如我的bai安装在D盘的python 2.7文件du夹zhi下面,我就dao找到这个文件夹. 然后复制这个文件地址 CTRL+C复制. 第二步: ...

  8. python环境变量配置_21 python环境的配置

    " 你活得久了,就会发现人生充满惊奇 " 本小节概览 Python的安装 多个版本Python环境共存问题 搭建Python虚拟环境 python的安装 step1:官网下载并安装 ...

  9. vscode python环境变量_VScode配置Python开发环境

    概念:VScode,单次运行一个脚本称为一个 task,对应的配置文件为 tasks.json: 整个文件夹或者多个文件夹视为一个工作空间,配置文件为 settings.json,调试环境的配置文件叫 ...

  10. python环境变量配置

    python现在的版本,主要是python2和python3两个大版本,这两个版本有很大的不同. 当我们在自己电脑上同时安装了python2.x和python3.x版本的解释器的时候,就需要对环境变量 ...

最新文章

  1. HDU 1084 - What Is Your Grade?
  2. face recognition[翻译][深度学习理解人脸]
  3. HDU 5392 BC #51
  4. 生动形象的理解什么是装饰器!
  5. 数据不足,如何进行迁移学习?
  6. 二分法求函数的零点(信息学奥赛一本通-T1241)
  7. PHP spl_autoload_register()函数使用
  8. SpringBoot基础教程2-1-6 日志规范-使用AOP统一处理Web日志
  9. 【Ansible 文档】【译文】Ad-Hoc 命令介绍
  10. MySQL的timeout那点事
  11. ojdbc maven
  12. 频段、信道带宽、EARFCN、频段和EARFCN之间的换算
  13. MATLAB计算图片的标准差与方差 MEAN STD
  14. 2022年3月22日
  15. 利用快速傅里叶计算多项式相乘
  16. EDA安装------Centos7安装ANSYS
  17. Python 学习:函数
  18. 背单词APP测试与评估(百词斩vs扇贝)
  19. 防止其他域名指向你的服务器的一种方法
  20. RC电路的充放过程C语言实现,一文讲解RC电路耦合、相移、滤波、微分、积分......

热门文章

  1. openfoam安装中出现allmake error_深入理解 OpenFOAM 环境与编译过程
  2. 【Python】【应用 01】使用python初步处理文件数据就那么简单!(本文以处理excel和目录为例)
  3. Spring Boot + MyBatis + MySQL读写分离
  4. 推荐一个牛逼的 GitHub 项目+支付宝、微信支付项目实战!快来获取!
  5. String类为什么被设计为不可变的?
  6. Redis 过期键删除策略
  7. struts2的OGNL表达式(二)
  8. 一天搞定CSS:支持IE的Layout布局--16
  9. python回调函数实例详解_Python回调函数用法实例详解
  10. ACM中Java输入输出