设为首页 加入收藏

TOP

源码看Flask框架配置管理(一)
2019-09-03 02:47:39 】 浏览:26
Tags:源码 Flask 框架 配置 管理

为了达到对配置方便快捷而又灵活管理的目的,Flask提供了一个名为“config的”属性,这个属性在Flask应用实例化时创建,所以,只要创建了Flask应用,就可以使用这个config属性进行配置管理。我们先创建一个Flask应用,去看一看这个config属性:


 输出结果:


<class 'flask.config.Config'>


可以看出,app.config是一个类,一个定义在flask.config模块中的类。既然是一个类,我们就可以推测,Flask在实例化应用时,也实例化了这个Config类,我们通过这个类提供的各种属性、方法来进行配置管理。如果你用的IDE是pycharm,按住Ctrl鼠标左键点击app.config中的config就可以定位到Flask类中定义config属性的源码,这一行源码如下:


在一行代码在Flask构造方法__init__()中,正如刚才所说,确实是在实例化Flask应用时创建了config属性。不过在值是Flask类中的make_config()方法的返回值,参数instance_relative_config是__init__()方法的参数,默认为False,具体功能我们在下文解析时用到再说。现在,我们去看一下make_config()方法的源码:


make_config()方法执行可以分为4个步骤:读取配置文件路径、读取默认配置、设置环境和模式、创建Config配置类。可以说,前面3个步骤都是为创建Config类做准备,里面的细节大家看上面代码注释就明白了,重点在于创建Config类,继续往下查看config_class:


config_class就是Config类,这里只不过做了一个赋值。继续查看Config:


当看到这个Config类代码时,仿佛一切都恍然大悟——一切配置操作都在这里。从源码中我们可以看到,Config类继承了dict,也即是说,Config类就是一个字典,一切字典所拥有的使用方法,在Config类上也行得通。


大概浏览config.py文件,可以看到,在Config类中还提供了几个名称很相似的方法:


from_object(self, obj)


from_pyfile(self, filename, silent=False)


from_envvar(self, variable_name, silent=False)


from_json(self, filename, silent=False)


from_mapping(self, *mapping, **kwargs)


阅读方法文档获知,这几个方法是读取配置用的,只不过读取的目标不一样,也就是说,Flask通过提供这几个方法为用户提供了多种配置管理方式。


接下来,我们来捋一捋Flask的配置管理方式。


通过上面的分析我们知道,Config类继承类字典类,所以我们可以用字典的方式进行配置管理,例如是config['key'] = value的方式赋值,通过config.get(key)方式取值:


输出:


是否开始调试模式: True


注意:Flask中所有配置名称都是大写。上面DEBUG配置中,如果写成了debug,那就会在app.config中添加一个debug的配置,而不是修改DEBUG,开启调试模式就会失败。


也可以调用字典类中的一些方法,例如调用update方法一次性设置多个值:


甚至可以将一些默认配置中没有的值存入配置中:


输出:


我是aaaaa


对于一些小应用来说,这种确实很是简单方便,但是对于更为复杂的应用,可能需要针对不同的环境使用不同的配置,配置的内容又多,这种方法就显得麻烦了。这时候就需要用到Config类中实现的几个方法了。


先来看看from_object()方法的源码:


从源码可以看出,from_object()方法说接收的参数obj可以使str类型,可以是一个模块,甚至是一个类。


我们先尝试一下是一个模块的情况,创建一个settings.py模块,内容如下:


这里只写了两个配置,你可以写更多,无所谓。怎么使用呢?


输出:


DEBUG: True


TESTING: True


A: 123


当obj是一个字符串时:


输出:


DEBUG: True


TESTING: True


A: 123


看出来了吗?无论是使用app.config.from_object(settings)还是app.config.from_object('settings')使用的都是使用settings.py文件中的配置,至于原因,如果不明白就回去看看上面的源码。


如果obj是一个类时,我们修改一下settings.py,如下:


在settings.py模块中,我们定义了多个类,首先是Config类,这个类定义的是默认配置,其他类都继承Config类,每一个之类代表一种配置,如果需要子类中可以覆写Config,如果不覆写则使用Config中的默认配置。怎么使用呢?


输出:


DEBUG: False


TESTING: False


DATABASE_URI: mysql://user@localhost/foo


使用这种方法的好处是可以充分利用面向对象中继承等的优良特性共享配置,设置多套配置,使用时,只需要针对实际需要修改app.config.from_object(settings.ProductionConfig)中传入的类即可。这种方法在实际开发中也是使用最多的。


继续解析源码:


在上一章节分析from_object()方法时,我们说到,from_object()方法可以接受一个模块作为参数,from_pyfile()方法接受的就是一个py文件作为参数,在Python中一个py文件就是一个模块,那from_object()方法与from_pyfile()方法有什么区别呢?从源码汇总我们可以看出,from_pyfile()方法接受一个文件名作为参数,我们可以认为,使用from_pyfile()方法读取配置时,我们只能直接将配置写在py文件中,而不能是写在py文件中定义的类。from_pyfile()方法思路就是传入一个py文件名,然后对文件进行解析,转为模块对象,调用from_object()方法对解析到的模块对象读取配置。


分析完了我们就来使用一下吧,settings.py文件内容如下:


读取配置:


输出:


DEBUG: True


TESTING: True


A: 123


这种方式是以元组或者字典的形式来管理配置,先来看看源码:


就算看完了上面的代码解析,你也许知道了代码做了什么,但是却还不知道为什么这么做,来,我们尝试使用一下也许你就明白了:


上面代码中,我们定义了元组和字典(实际开发中最好在一个专门的模块中定义),使用元组进行配置的方法我注释掉了,运行效果都是一样的,你可以调试一下,加深理解源码。输入如下:


DEBUG: True


TESTING: False


A: 123


B: 456


如果你喜欢用json文件的方式来管理配置,那么,from_json()方法刚好适合你,我们来了看看这个方法的实现:


如果你理解了上面from_mapping()方法,那么,对于这个from_json()方法也很好理解了,因为from_json()方法只是读取json文件成字符串后反序列化成字段传入from_mapping()。


在使用from
源码看Flask框架配置管理(一) https://www.cppentry.com/bencandy.php?fid=54&id=246771

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Shell编程三剑客grep、sed和awk详.. 下一篇为什么for循环可以遍历list:Pyth..