咪哥,热爱Python的Java程序员,致力于分享 Python 好玩的事儿。
博客:http://blog.csdn.net/s740556472
本文作者已加入Python中文社区专栏作者计划
在看 Python 的 Flask 框架时,学习到了一个非常有用并且灵活的思想,不知道是不是现在各大互联网公司都是通过此思路实现灵活配置的,反正笔者之前所在的公司不是通过此种方法进行灵活配置的….
做 Web 后台的同学们都知道,各家公司在正式上线代码之前都有着不同的环境,比如开发环境、测试环境、验证环境、生产环境等等….对于不同的环境来说,涉及到的配置文件就很头疼,不同环境所对应的配置文件内容也会不一致,生产环境的有生产配置文件对应地址,测试环境的有测试配置文件所对应的地址。
而笔者之前开发时,大家采用的是对同一个配置文件名称里进行修改,比如有个叫 readme.properties 的文件,其中有 url 参数,开发环境的
url = http://127.0.0.1/hello ,
而生产环境则要对应的地址
url = http://10.10.23.1/hello。
这样一来写好两个,开发分支,注释掉生产环境的地址,上生产时,则打开生产的 url ,注释掉测试环境的。
以上场景,会遇到一个问题,人都有犯错不仔细的时候,万一忘了注释修改相应的配置,打包上传升级后,就会影响到生产环境,造成一些不必要的损失。
有种思路可以很轻松地解决这种问题,就是不要将所有环境都写在同一个配置文件里,尽可能的把配置文件按照环境不同进行拆分。虽然可能项目中的配置文件会很多,但是百分之百的正确总比多配置文件要稳。
例如下图的一个项目小例子,同一个项目所依赖的文件,分为三种环境,一个是默认用到的配置文件,一个是本地开发用到的配置文件,还有一个是生产上用到的配置文件:
01.png对于这三者配置文件是有个命名规范的,下划线前面是环境的英文名称,而后面则是 setting 。分开之后,要思考的关键是,在引入配置文件处,如何使用代码对其进行一个灵活的控制?
重点思路:设置系统自身的环境变量来控制项目中的环境!
以 Python 代码为例,看下如何灵活的配置,思路是通用的,不论是什么语言,终归是能实现的!
代码如下:
# 读取 config 目录下的 base_setting 文件
self.config.from_pyfile('config/base_setting.py')
# 获取系统环境变量,如果包含了 ops_config ,则读取 ops_config 对应的值
if 'ops_config' in os.environ:
self.config.from_pyfile(f'config/{os.environ["ops_config"]}_setting.py')
此处是读取 Python 配置文件时的地方,默认加载 base_setting.py 配置文件,如果当前系统环境变量包含 ops_config 字段,将之读取到,读取当前系统环境变量配置的值,覆盖原有配置文件。
这么解释代码可能不是很明白,继续来看下,此处环境变量是指的什么?
02.png 03.pngf'config/{os.environ["ops_config"]}_setting.py'
中的os.environ["ops_config"]获取的就是上面图片红框标注的值。
在 linux 下,对环境变量设置一个
ops_config=local
这样通过代码中读取到的文件则是 local.setting.py 文件了。
通过此方法,比如在测试环境,则只需要在对应的 linux 机器上设置
ops_config=test
代码中覆盖掉默认的 base.setting,加载的则会是 test.setting 配置文件。
学习到了这个思想的笔者,反正是恍然大悟,原来环境变量还可以这么玩…使用上述思路达到的效果就是项目各环境分开明确,不会引起混乱,升级的时候只需要全升级即可。
编程语言不是问题,主要还是思想呐!
zhi
支
chi
持
zuo
作
zhe
者
长按扫码鼓励作者
点 击 投 稿
▼ 点击成为社区注册会员 「在看」一下,一起PY!