上一节咱们编写好了环境管理功能,这一章节我们来继续完善<code>全局变量</code>功能。
全局变量,其实我觉得叫它全局配置更加贴切。我理解的全局变量,其实是我们常用的一些不太变化的数据,而用例中出现的变量,我认为它是一个临时的数据,不会进行<code>永久存储</code>。
那什么时候会用到这些变量呢?比如咱们的一些常用的测试地址,ip也好url也好,如果用例不把这块内容抽离出来,一旦地址发生变化,会出现2个问题。
我们需要对用例进行修改
修改的成本较大
有同学可能会说,那我去<code>数据库</code>里面直接update一下不就好了?是的,你可以这么做。但是谁能保证update的时候不会出错,谁又能保证每一次都能及时update了呢?所以,如果我能在<code>全局变量</code>页面进行统一修改,那不是事半功倍吗?这也就是我所说的,它其实更像一个<code>全局配置</code>。
其实我们提供的全局配置,类似于Redis,是一个key-value的形式。用户如果使用的话,只需要输入key,就能够映射到对应的value。
想象一下,如果一个value能够存放int,str, float等多种对象,那么Mysql里面这个字段该如何设计?所以这个时候我们就要加以辅佐,我们引入一个<code>key_type</code>字段,配合value实现一个字段多种数据类型的功能。
但我这边又不想太复杂,因为咱都是懒人。其实我们定义几种类型就够了:
string
json
yaml
为什么只有3种类型?因为已经够了,如果是string类型,则不需要进行json.loads()去获取数据,如果是json,我们默认通过json.loads()去转换一下数据。至于yaml,纯粹是为了<code>新鲜</code>。
为什么说我们用json就可以拿到float,int,bool等等值呢?我们来看一个例子:
那么我们存在数据库的值是varchar类型的<code>0.618</code>,那我们放入Python可以表现为这样:
那怎么得到float呢?

image.png
同理试一下bool:
至于string为什么和json区分开,其实json就是个string,所以我们如果遇到string类型就不做任何json.loads的处理,即可保留<code>原滋原味</code>。
env: 变量对应的环境,如果env为0的话,说明这个变量属于全部环境。
enable: 变量是否可用,是一个开关字段,可临时关闭该变量
注意这里有一个联合唯一索引,根据env,key和deleted_at生成,只有当env,key,deleted_at都相等的时候,数据库才不让插入数据。这样解决了一个在environment表里面出现的问题:
<code>当环境abc被删除以后,无法再建立名为abc的环境</code>
看过上一篇文章的都知道细节,其实我写代码的时候也是copy的。
大家有没有发现: <code>编写一个crud的功能是真的不难!</code>基本可以按照固定的套路来,像我都是copy的上一个功能点的代码,然后稍作改动。
其实大体上还是和之前的<code>router</code>差不多,但是这里多了一个细节:
当config router下面有个文件的时候会怎么样?
我们这里有一个gconfig和一个envrionment,里面大概8个接口。
envrionment定义了ApiRouter的router对象,gconfig引入了router对象。那么我们的接口会被成功注册吗?
<code>答案是不会的,大家可以试一试。</code>
因为顺序是这样的:
router = ApiRouter() # environment中发生
pity.include_router(config.router)
router注册gconfig的接口
因为咱们运行的是main.py文件,main.py在import router的时候肯定是最先发生的。其实flask也会遇到这样的问题,解决方法有2个。
快速法
main.py注册router的时候,选用最后一个。
举个例子,envrionment创建了router,gconfig引入了router,我们从gconfig import router就行。但这样不会太保险,因为还是可能会遗漏或者搞错。
利用__init__.py
最后在注册的时候import init.py里面的router即可。简单的说就是搞一个专门收集router的文件,最后集中注册。
本期除了写了全局变量功能以外,还解决了2个问题:
联合索引问题
router注册问题
希望对大家有帮助~
后端地址: https://github.com/wuranxu/pity
前端地址: https://github.com/wuranxu/pity