使用蓝本的原因:
使用程序工厂函数使得路由(查找)变复杂【路由是根据url查找处理函数的过程】
但脚本程序中,程序实例存在于全局作用域,路由使用app.route修饰器定义
但是使用了工厂函数,程序延迟创建,当调用create_app()之后,程序app创建后,才可以用app.route修饰器,但是太晚了
同样的还有错误页面处理需要用到程序app,进行app.errorhandler修饰器定义
蓝本介绍:
flask认可的兼容的支持的模块化方法,提供blueprint方法实现模块化组织程序结构
我们可以使用blueprint进行不同模块的编写,不同模块之间有着不同的静态文件、模板文件、view文件,十分方便代码的维护和管理
功能:
Blueprint通过把实现不同功能的module分开,从而把一个大的application分割成各自实现不同功能的module。在一个Blueprint中可以调用另一个blueprint的view function, 但要加相应的blueprint名。
和程序类似可以定义路由
不同的是:
蓝本中定义的路由处于休眠状态,知道蓝本注册到程序上,路由才真正的是程序的一部分
蓝本定义路由的方法:
蓝本使用全局作用域时,蓝本定义路由的方法和但脚本文件一样
蓝本的定义:
蓝本可以再单个文件中定义,也可以使用结构化的方式在包中的多个模块中创建
程序包中创建一个子包,用于保存蓝本
蓝本的使用:
创建蓝本
from flask import Blueprint
main = Blueprint('main',__name__)
from . import views,errors # 蓝本定义的路由和错误处理
- 实例化Blueprint()创建蓝本
- 参数 :1)蓝本的名字 2)蓝本所在的包或模块
- 程序的路由保存在app/main/views.py的模块中,错误处理在app/main/errors.py的模块中
from . import views,errors
导入这两个模板,可以让路由和错误处理程序和蓝本关联
导入是在appp/main/init.py中的末尾,避免循环导入依赖,因为在views.py中还要蓝本
蓝本注册到程序:
蓝本是在工厂函数的create_app()中注册到程序的
def create_app(config_name):
...
from .main import main as main_blueprint
app.register_blueprint(main_blueprint)
return app
蓝本中的错误处理程序
from flask import render_template
from . import main
@main.app_errorhandler(404)
def page_not_found(e):
render_template('404.html'),404
@main.app_errorhandler(500)
def internal_server_error(e):
render_template('500.html'),404
- 注册程序全局的错误处理程序,使用app_errorhandler
蓝本中定义的程序路由
from datetime import datetime
from flask import render_template,session,redirect,url_for
from . improt main
from .forms import NameForm
from .. import db
from ..models import User
@main.route('',methods = ['GET','POST'])
def index():
...
return redirect(url_for('index'))
render_template('index.html ',
form = form
name = session.get('name')
known = session.get('known',False)
current_time = datetime.utcnow()
)
与之前的不同点:
- 路由修饰器由蓝本提供
- url_for ():
- 在但脚本文件中,参数是路由的端点名,默认视图函数的名字
flask为蓝本中的全部端点加一个命名空间,可以在不同的蓝本中使用相同的端点名定义的视图函数
不产生冲突,命名空间就是蓝本的名字,所以视图函数注册的端点名是main.index - url_for()支持简写的端点形式,蓝本中省略蓝本命
url_for(‘.index’)
这种写法,命名空间是当前请求所在的蓝本
==================================================================================================================