Flask 蓝图

蓝图被用来构建  业务功能可拆分  的目录结构,这在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()

在这种情况下,一定要注意引用的写法,容易导致循环引用。

上一篇:Flask 路由的对应关系之mapping is overwriting

下一篇:数据库连接池