以上内容为我自己源码总结,可能存在一些问题。 关于蓝图 蓝图的使用第一步导入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./content-4-305001.html |
|