以上内容为我自己源码总结,可能存在一些问题。
关于蓝图
蓝图的使用第一步导入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这个字典中去
所以实现了配置的加载
来源:https://www.icode9.com/content-4-305001.html联系客服