蓝图被用来构建 业务功能可拆分 的目录结构,这在django中是通过一个个app实现的,而flask是没有这样的设定的,所以blueprint就发挥作用了。
简单点说:蓝图就是一个存储路由映射的容器,主要用来实现客户端请求和URL相互关联的功能,在Flask中,使用蓝图可以帮助我们实现模块化应用的功能(在django中我们通过include() 方法来包含一个app的url)
下面看一个使用blueprint的实例;
先看下目录结构:
其中 accout.py中定义了三个函数, admin中定义了两个:
account.py
#!usr/bin/env python
# *- coding:utf-8 -*-
# Andy Create @ 11/19/2019 10:02 PM
from flask import Blueprint
account = Blueprint('account', __name__, template_folder='templates')
@account.route('/login', methods=['GET', "POST"], endpoint='login')
def login():
return 'login'
@account.route('/register', methods=['GET', 'POST'], endpoint='register')
def register():
return 'register'
@account.route('/logout', methods=['GET'], endpoint='logout')
def logout():
return 'logout'
这里accout是一个蓝图对象,我们是将login这些视图函数注册到accout这个蓝图中,而blueprint()的第一个参数’admin'表示 蓝图的名称
admin.py
#!usr/bin/env python
# *- coding:utf-8 -*-
# Andy Create @ 11/19/2019 10:02 PM
from flask import Blueprint
admin = Blueprint('admin', __name__, template_folder='templates')
@admin.route('/add_user', methods=['GET', "POST"], endpoint='add_user')
def add_user():
return 'add_user'
@admin.route('/delete_user', methods=['GET', ], endpoint='delete_user')
def delete_user():
return 'delete_user'
在blueprint_demo这个包的__init__中定义了个创建app的函数
blueprint_demo/__init__.py
#!usr/bin/env python
# *- coding:utf-8 -*-
# Andy Create @ 11/19/2019 10:00 PM
from flask import Flask
from .views import account, admin
def create_app():
app = Flask(__name__)
app.secret_key = 'blueprint_demo_key'
app.register_blueprint(account.account)
app.register_blueprint(admin.admin)
return app
在注册蓝图时,可以指定蓝图的前缀:如:app.register_blueprint(account.accout, url_prefix='/accout'),这样访问login, register, logout时需要加上/accout,即:/accout/login, 且这里的‘/accout'必须这样写,不能少斜杠。这样就实现了类似django中namespace的功能。
manage.py
#!usr/bin/env python
# *- coding:utf-8 -*-
# Andy Create @ 11/19/2019 10:01 PM
from blueprint_demo import create_app
app = create_app()
if __name__ == '__main__':
print(app.url_map)
app.run()
在这种情况下,一定要注意引用的写法,容易导致循环引用。