配置模块

在看了Gunicorn的源码之后,最让我感到兴奋的是它的配置相关的模块,其实他配置相关的模块和我平时看Flask等相关的框架的配置模块的技术实现有很大的不一样。
因为涉及到命令行参数的输入,一般Flask都是直接调用的是Click这样类似的第三方框架来实现命令行的输入,配置还有校验。而对于Gunicorn来说,则不一样,它利用了99%的人不会用到的Metaclass(元类)的技术来巧妙的实现了命令行配置的输入,配置还有校验。
元类的作用主要是用于在类进行初始化的时候,动态的去修改类的属性。有时候通过巧妙的使用元类,可以让我们的代码更加优雅,这就是一个很好的例子。

Metaclass类(元类)

这个元类的机制主要实现是在gunicorn项目中的config.py文件中。

上图是元类(SettingMeta)的实现,如果对于元类有了解的人可以看出,在初始化该类的时候,这个元类给当前类加上了order, validdator, desc, short等相关的属性,还做了相应的一些处理。


上图是基础Setting基类的实现和给Setting基类加上元类,它包含了一些基础的方法实现和一些类变量的定义。
最后一句则是将基类(Setting)通过SettingMeta包装实现了一个新的Setting类。这样只要继承Setting类的子类在初始化的时候都会进行元类new方法中的步骤。


上图是对传递class的参数进行校验的函数。其实在整个配置文件中有很多的类似的校验函数,这里取这个类的校验函数作为例子来进行讲解。


此类是—-worker-class参数的校验类,可以从上面的代码看到,他定义了该类的名字为worker_class, 定义了他的传参方式为cli中的—worker-class, 定义了该参数的类型(meta)为STRING类型, 校验函数(validator)则是我们上面提到的validate_class,默认值(default)为sync,还有就是关于这个参数的描述。

如果把上面的代码串起来,则是当在执行gunicorn时,指定了—worker-class的参数时,那么它将会对此参数通过validate_class来进行校验,若不传该值,那么此配置则为默认值sync。

配置校验流程

这一小结将会讲述从程序运行到整个程序校验的流程。这样就可以把整条流程串起来了。
一、通过命令行启动程序。
首先通过gunicorn —worker_class gevent —workers=2 flaskapp:app来启动程序。

二、配置文件加载进入内存,实现类加载。
程序开始运行时,会将相关的类加载到内存中,实现类的初始化,全局变量的初始化。其中在这里将进行上一节讲的元类对所有的配置类进行包装。使得每个配置类通过元类的机制和自带的类属性加载成各个不同的配置类。

三、程序运行进入配置类初始化。
程序进入main函数,然后进行代码处理,将用户自定义配置传入到config类中。

四、配置类进行将参数加入到参数校验类中。
通过config类中的parser()函数将自定义配置加载到Python原生的参数解析类(argsparser)中。然后通过实例化的argsparser对参数逐一进行校验。

五、配置校验成功\失败结果处理。
如果argsparser函数中有校验出错的配置,则返回错误信息,否则则进入下一个阶段。

最后附上整体流程的代码:

发表评论

电子邮件地址不会被公开。 必填项已用*标注