blueprint把不同功能的module分开。可以让应用模块化,针对大型应用。
蓝图的基本概念:在蓝图被注册到应用之后,所要执行的操作的集合。当分配请求时, Flask 会把蓝图和视图函数关联起来,并生成两个端点之前的 URL 。
比如只有一个run.py。有些功能需要多人分开来写,有些功能会有交错的可能,代码位置也不会在一起,这样可以用蓝图来开关一些模块(功能)和宏定义类似,但不是可插拔的应用而是一套可以注册在应用中的操作,并且可以注册多次。或者简单滴需要降低耦合,提高模块复用率。比如开发环境和应用环境的不同,可以用蓝图来切换环境。
蓝图的缺点是一旦应用被创建后,只有销毁整个应用对象才能注销蓝图。
在单脚本程序中,程序实例存在于全局作用域中,路由可以直接使用app.route修饰器定义。但现在程序在运行时创建,只有调用create_app()之后才能使用app.route修饰器,这时定义路就太晚了。蓝本和程序类似,也可以定义路由。不同的是,在蓝本中定义的路由处于休眠状态,直到蓝本注册到程序上后,路由才真正成为程序的一部分。使用位于全局作用域中的蓝本时,定义路由的方法几乎和单脚本程序一样。为了获得最大的灵活性,程序包中创建了一个子包,用于保存蓝本。
app/main/init.py:创建蓝图
from flask import Blueprint
main = Blueprint('main', __name__)#两个必要参数'main'蓝图名字;'__name__'蓝图所在的模块或者包,一般为'__name__'变量
#实例化一个Blueprint 类对象创建蓝图
from . import views, errors
app/init.py:注册蓝本
def create_app(config_name):
# ...
from .main import main as main_blueprint
app.register_blueprint(main_blueprint)
return app
app/main/errors.py:蓝本中的错误处理程序
from flask import render_template
from . import main
@main.app_errorhandler(404)
def page_not_found(e):
return render_template('404.html'), 404
@main.app_errorhandler(500)
def internal_server_error(e):
return render_template('500.html'), 500
app/main/views.py:蓝本中定义的程序路由
from datetime import datetime
from flask import render_template, session, redirect, url_for
from . import main
from .forms import NameForm
from .. import db
from ..models import User
@main.route('/', methods=['GET', 'POST'])
def index():
form = NameForm()
if form.validate_on_submit():
# ...
return redirect(url_for('.index'))
return render_template('index.html',
form=form, name=session.get('name'),
known=session.get('known', False),
current_time=datetime.utcnow())
如果使用errorhandler 修饰器,那么只有蓝本中的错误才能触发处理程序。即修饰器由蓝本提供。要想注册程序全局的错误处理程序,必须使用app_errorhandler。
创建 URL用法:
Flask 会为蓝本中的全部端点加上一个命名空间,这样就可以在不
同的蓝本中使用相同的端点名定义视图函数,而不会产生冲突。(跨蓝本)
在单脚本程序中:index() 视图函数的URL 可使用
url_for(‘index’)
在蓝图中:index() 视图函数的URL 可使用
url_for(‘main.index’)
另外,如果在一个蓝图的视图函数或者被渲染的模板中需要链接同一个蓝图中的其他端点,那么使用相对重定向,只使用一个点使用为前缀。简写形式(命名空间是当前请求所在的蓝本):
url_for(‘.index’)
附上官方文档:使用蓝图的模块化应用