Flask——蓝图

Blueprint概念

简单来说,Blueprint 是一个存储操作方法的容器,这些操作在这个Blueprint 被注册到一个应用之后就可以被调用,Flask 可以通过Blueprint来组织URL以及处理请求。
Flask使用Blueprint让应用实现模块化,在Flask中,Blueprint具有如下属性:
一个应用可以具有多个Blueprint
可以将一个Blueprint注册到任何一个未使用的URL下比如 “/”、“/sample”或者子域名
在一个应用中,一个模块可以注册多次
Blueprint可以单独具有自己的模板、静态文件或者其它的通用操作方法,它并不是必须要实现应用的视图和函数的
在一个应用初始化时,就应该要注册需要使用的Blueprint
但是一个Blueprint并不是一个完整的应用,它不能独立于应用运行,而必须要注册到某一个应用中。

道生一,一生二,二生三,三生万物。论如何实现三个模块化?

1.蓝图文件,即实现功能的总代码:

from flask import Flask
# 循环导入:两个文件互相导入对方文件中的内容,会发生循环导入。
# 解决的思路:交错导入。

# 导入蓝图对象
from temp_detail import api
app = Flask(__name__)
# 3----注册蓝图对象
app.register_blueprint(api)

@app.route('/')
def index():
    return 'index'

if __name__ == '__main__':
    print(app.url_map)
    from temp_detail import detail
    app.run(debug=True)

2.模块化的第二个文件:

# from demo3_blueprint import app
# 结论:导包解决不了路由映射的问题。
from flask import Blueprint

# 1---创建蓝图对象,第一个参数表示蓝图名称,会和视图函数名绑定在一起:蓝图名称.视图函数名。前缀是为了更好的根据地址区分模块。
#  http://127.0.0.1:5000/goods/detail
#  http://127.0.0.1:5000/news/list
api = Blueprint('api',__name__,url_prefix='/news')

# 二生三:需要把再次拆分的文件,在创建蓝图对象的下面导入,避免循环导入
from temp_list import list

# 2---使用蓝图对象
@api.route('/detail')
def detail():
    return 'detail'

3.模块化的第三个文件:

from temp_detail import api

@api.route('/list')
def list():
    return 'list'

运行机制

蓝图是保存了一组将来可以在应用对象上执行的操作,注册路由就是一种操作
当在应用对象上调用 route 装饰器注册路由时,这个操作将修改对象的url_map路由表
然而,蓝图对象根本没有路由表,当我们在蓝图对象上调用route装饰器注册路由时,它只是在内部的一个延迟操作记录列表defered_functions中添加了一个项
当执行应用对象的 register_blueprint() 方法时,应用对象将从蓝图对象的 defered_functions 列表中取出每一项,并以自身作为参数执行该匿名函数,即调用应用对象的 add_url_rule() 方法,这将真正的修改应用对象的路由表

猜你喜欢

转载自blog.csdn.net/weixin_43617255/article/details/83997483