多模块应用

在前面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模块的蓝图提供响应了。