flask深度研究之蓝图和配置加载

以上内容为我自己源码总结,可能存在一些问题。

关于蓝图

蓝图的使用第一步导入flask中的Blueprint对象,并实例化这个对象,然后通过这个对象进行路由的注册,即对象.route(传入的参数)

该过程会调用蓝图对象的add_url_rule(),所传入的参数rule为注册路由的参数,即rule=传入的参数,endpoint暂时为空,并把视图函数的地址值传进去

在add_url_rule()中会调用蓝图对象的record()方法,传入参数为一个匿名函数,

lambda s: s.add_url_rule(rule, endpoint, view_func, **options) 匿名函数的参数一次为add_url_rule()传入的参数

该方法会执行以下代码

self.deferred_functions.append(func)  func为传入的匿名函数,即把该函数存入一个列表

蓝图使用的最后一步,在app对象中注册蓝图

这一步会调用app对象的register_blueprint()方法,app的注册方法会调用蓝图的注册方法 并传入参数 first_registration=True, option为空

蓝图的注册方法会首先调用make_setup_state()得到一个 BlueprintSetupState类  传入参数app为注册蓝图的app对象,以及从上面方法传递过来的参数, 并用一个status变量接收这个类对象

然后会调用这个对象的add_url_rule(),传入的参数rule为静态文件夹名+'/<path:filename>', endpoit为静态文件夹名,视图函数为 self.send_static_file地址值

最后会对deferred_functions这个列表进行遍历,并调用列表中的方法,即注入蓝图路由是传入的匿名函数,参数为status

即调用status.add_url_rule(rule, endpoint, view_func, **options) 参数rule为注册蓝图时传入的参数,option和endpoint为空,view_func为试图函数地址值

status的add_url_rule方法会调用app的add_url_rule,第一个参数rule为加上了前缀的rule参数,第二个参数为'%s.%s' % (self.blueprint.name, endpoint),第三个参数为传递过来的视图函数地址值,第四个参数

defaults默认为一个空字典

app的add_url_rule()方法会进行一些操作,我也没有过多去了解,最终则在view_functions这个字典里加上key为[endpoint],value为视图函数地址值的一条数据

关于配置加载

app.config = self.config =self.make_config(instance_relative_config) = Config()即flask内置的配置类,app.config.from_object()调用配置类的方法

方法内容如下

if isinstance(obj, string_types):
            obj = import_string(obj)
for key in dir(obj):
  if key.isupper():
    self[key] = getattr(obj, key)

我们传入的参数obj为自己定义的类所以会直接走for循环

for循环会遍历类中的属性和方法,若方法名或属性名为全部大写,则获取该方法或属性的数据并添加到Config这个字典中去

所以实现了配置的加载

猜你喜欢

转载自www.cnblogs.com/HZHST/p/11142688.html