多模块应用
在前面aiohttp的章节提到过,aiohttp支持将一个巨型站点应用拆分成多个模块聚合的应用。Flask也支持这种功能,称之为“蓝图”(Blueprint)。蓝图的创建十分简单,flask
模块提供了Blueprint
类。Blueprint
类的初始化需要三个参数,第一个参数是蓝图的名称,第二个参数为蓝图的定义位置,一般会传递__name__
作为位置说明,第三个参数一般使用命名参数url_prefix
来指定蓝图对应的URl前缀。例如admin = Blueprint('admin', __name__, url_prefix='/admin')
。
蓝图可以像一个Flask实例那样使用,延续上面的示例,可以使用@admin.route()
来定义蓝图中的路由处理函数。蓝图在Flask实例中使用.register_blueprint()
方法绑入应用中。具体可参考以下示例。
假设有以下蓝图:
# 与__init__.py同级的admin.py文件,即admin模块
from flask import Blueprint, request, current_app, jsonify
bp = Blueprint('admin', __name__, url_prefix='/auth')
@bp.route('/login', methods=('POST'))
def admin_login():
username = request.form['username']
current_app.logger.debug("User attempt to login: %s", username)
return jsonify()
在__init__.py
中可以这样来引入注册。
from flask import Flask
def create_app():
app = Flask(__name__)
# 引入语句不一定必须在脚本的头部,这里引入前面定义的admin模块
from . import admin
app.register_blueprint(admin.bp)
return app
此时再访问/auth/login
就会由admin模块的蓝图提供响应了。