查看原文
其他

一个灵活的代码配置思路

咪咪怪 咪哥杂谈 2019-10-31
咪哥杂谈

一个灵活的代码

配置思路


本篇阅读时间约为 4 分钟。


1

前言


本篇文章分享给那些正在码程序的同胞们!若看懂本篇文章需要有些编程基础才能看懂笔者所写,非战斗人员尽快撤离!~


今天在看 Python 的 Flask 框架(一个敏捷的 web 框架)时,学习到了一个非常有用并且灵活的思想,不知道是不是现在各大互联网公司都是通过此思路实现灵活配置的,反正笔者之前所在的公司不是通过此种方法进行灵活配置的....所以分享记录下,看懂的可以留言讨论下,看不懂的呢...看个乐子吧!


2

业务场景


做 Web 后台的同学们都知道,各家公司在正式上线代码之前都有着不同的环境,比如开发环境、测试环境、验证环境、生产环境等等....对于不同的环境来说,涉及到的配置文件就很头疼,不同环境所对应的配置文件内容也会不一致,生产环境的有生产配置文件对应地址,测试环境的有测试配置文件所对应的地址。


而笔者之前开发时,大家采用的是对同一个配置文件名称里进行修改,比如有个叫 readme.properties 的文件,其中有 url 参数,开发环境的 

url = http://127.0.0.1/hello ,

而生产环境则要对应的地址 

url = http://10.10.23.1/hello。


这样一来写好两个,开发分支,注释掉生产环境的地址,上生产时,则打开生产的 url ,注释掉测试环境的。


以上场景,会遇到一个问题,人都有犯错不仔细的时候,万一忘了注释修改相应的配置,打包上传升级后,就会影响到生产环境,造成一些不必要的损失。


3

灵活配置的思路


有种思路可以很轻松地解决这种问题,就是不要将所有环境都写在同一个配置文件里,尽可能的把配置文件按照环境不同进行拆分。虽然可能项目中的配置文件会很多,但是百分之百的正确总比多配置文件要稳。


例如下图的一个项目小例子,同一个项目所依赖的文件,分为三种环境,一个是默认用到的配置文件,一个是本地开发用到的配置文件,还有一个是生产上用到的配置文件:



对于这三者配置文件是有个命名规范的,下划线前面是环境的英文名称,而后面则是 setting 。分开之后,要思考的关键是,在引入配置文件处,如何使用代码对其进行一个灵活的控制?


重点思路:设置系统自身的环境变量来控制项目中的环境!


4

代码实现


以 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 字段,将之读取到,读取当前系统环境变量配置的值,覆盖原有配置文件。


这么解释代码可能不是很明白,继续来看下,此处环境变量是指的什么?



f'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 配置文件。


5

心得


学习到了这个思想的笔者,反正是恍然大悟,原来环境变量还可以这么玩...使用上述思路达到的效果就是项目各环境分开明确,不会引起混乱,升级的时候只需要全升级即可。


编程语言不是问题,主要还是思想呐!



至此完!




▼往期精彩回顾▼Python 推导式与生成器!~付费知识的一些感想!!!发布一条重要消息!


长按关注

公众号名称:咪哥杂谈

一个咪咪怪的公众号

长按二维码关注哦!



    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存