zoukankan      html  css  js  c++  java
  • flask基础之蓝图的使用(七)

    前言

    关于蓝图是什么?或为什么使用蓝图的详细介绍,官方文档讲的很详细,不再赘述。简单来说,在大型的应用中,我们不想视图函数显得杂乱无章,难以维护,将众多的视图函数按照Api的设计规则进行切割是一个好方法。

    蓝图的简单使用

    • 第一步:创建蓝图
    # testblue.py
    from flask import Blueprint
    testblue = Blueprint('blue', __name__)
    @testblue.route('/index')
    def index():
        return 'OK'
    
    • 第二步:注册蓝图
    # __init__.py
    from testblue import testblue
    app = Flask(__name__,template_folder='static/html')
    app.register_blueprint(testblue, url_prefix='/testblue')
    if __name__ == "__main__":
        app.run()
    

    现在通过访问http://127.0.0.1:5000/testblue/index就可以访问到蓝图定义的api。

    蓝图和应用的关系

    蓝图的实现方式和应用十分相似,有着和app类似的运行机制,但它又不是一个应用,可以这样说,app对象管理着多个蓝图,多个蓝图共享app的配置文件,只有在app中注册过的蓝图才会起作用,否则无效;app调用register_blueprint注册蓝图,原理是:

    # 源码
    def register_blueprint(self, blueprint, **options):
        first_registration = False
        if blueprint.name in self.blueprints:
            ...
        else:
            self.blueprints[blueprint.name] = blueprint
            self._blueprint_order.append(blueprint)
            first_registration = True
        blueprint.register(self, options, first_registration)
    
    # 参数
    blueprint:蓝图对象
    url_prefix:url前缀,即统一在该蓝图的所有的url前面添加一个前缀;默认为空;
    subdomain:设置蓝图应该激活的的子域,默认为空;
    

    说明

    • 首先,app通过blueprints字典收集管理所有的蓝图,_blueprint_order属性列表存储所有的蓝图对象;

    • 蓝图对象blueprint调用register方法,会将蓝图下的所有视图函数添加到app的view_functions属性中,所有的Rule添加到APP的url_map属性中;

    Blueprint对象分析

    • Blueprint的初始化
    def __init__(self, name, import_name, static_folder=None,
                     static_url_path=None, template_folder=None,
                     url_prefix=None, subdomain=None, url_defaults=None,
                     root_path=None):
        pass
    
    # 参数
    name:设置蓝图的名字,这个名字是蓝图的标识,用来区分多个蓝图的不同;
    import_name:指定蓝图的资源文件夹,也就是蓝图的位置,该参数是模块的名字
    root_path:指定蓝图的资源文件夹的绝对路径,如果这个不是None,import_name的设置失效;
    static_folder:指定静态文件的路径,相对路径是相对于root_path;
    static_url_path:静态文件的url;
    template_folder:模板的路径;
    url_prefix:url的前缀,如果在蓝图注册的时候也设置了该参数,那会使用注册时的参数;
    subdomain:蓝图激活的子域;
    url_defaults:默认的路径参数和其对应的值的键值对,当其被设置后,本蓝图的所有视图函数便拥有该参数
    
    from flask import Blueprint
    testblue = Blueprint('blue', __name__, url_defaults={'name':'cai'})
    @testblue.route('/index')
    def index(name):
        print(name) # 拥有了默认的参数name
        return 'OK'
    
    • 重要的方法
    Blueprint.add_url_rule:往app中注册视图函数和路由规则;
    Blueprint.endpoint:装饰器,直接往app的view_funcs添加视图函数;
    Blueprint.before_request:装饰器,装饰的方法本蓝图的每个请求调用视图函数前执行
    Blueprint.before_app_request:装饰器,装饰的方法app所有请求调用视图函数前执行,但如果对应的蓝图有自己的before_request装饰方法则执行自己的
    Blueprint.before_app_first_request:装饰器,装饰的方法app所有请求第一次调用视图函数前执行;
    Blueprint.after_request:装饰器,装饰的方法本蓝图的每个请求调用视图函数后执行,如果对应的app有全局的after_request装饰方法则执行全局的
    Blueprint.after_app_request:装饰器,装饰的方法app所有请求调用视图函数后执行
    Blueprint.teardown_request:装饰器,装饰的方法本蓝图的视图函数是否有异常都会执行;
    Blueprint.teardown_app_request:装饰器,装饰的方法app所有视图函数是否有异常都会执行,但如果蓝图自己定义了则执行蓝图本身的
    Blueprint.app_errorhandler:装饰器,自定义app的所有的http请求的标准错误处理;
    Blueprint.errorhandler:装饰器,自定义本蓝图的所有http请求的标准错误处理
    Blueprint.url_value_preprocessor:装饰器,定义本蓝图所有的请求的url预处理
    Blueprint.url_defaults:装饰器,在app的url_default_functions中添加本蓝图的url生成的处理函数
    Blueprint.app_url_value_preprocessor:装饰器,定义app所有的请求的url预处理,如果蓝图有自己的预处理则使用蓝图本身的
    Blueprint.app_url_defaults:装饰器,在app的url_default_functions中添加app所有的url生成的处理函数,在调用url_for时会被调用
    Blueprint.register_error_handler:方法,手动添加蓝图的标准错误处理
    

    参考

  • 相关阅读:
    java BufferedImage 合成多张图片
    JQ 输入框控制输入
    SpringBoot读取静态资源文件
    Java获取永久图文素材中的网页端Url
    生成随机32位Token43位asekey
    SQL语句模糊查询年月
    go语言学习笔记3----流程控制
    go语言学习笔记2----变量、常量
    go语言学习笔记1----数据类型
    kettle抽取数据判断是否有数据
  • 原文地址:https://www.cnblogs.com/cwp-bg/p/10084467.html
Copyright © 2011-2022 走看看