蓝图:
蓝图在Flask中相当于是独立的,下面是使用方法
from flask import Blueprint   # 导入Flask中的蓝图Blueprint模块

sv = Blueprint("sv",__name__)  # 实例化一个蓝图对象

@sv.route("/svlist")  # 此处添加路由和视图函数跟在Flask对象中添加是一样的
def view_list():
    return "svlist_view_list"
写好之后,如果要在flask启动文件中用到的话,需要导入
from flask import Flask
from flask03.student_view import s_view  # 导入写好的蓝图模块


app = Flask(__name__)

app.register_blueprint(s_view.sv) # 在Flask对象中注册蓝图模块中的蓝图对象s_view中的sv

app.run("0.0.0.0",5000) # 此时flask对象中没有写任何的路由和视图函数,但是可以访问到蓝图中的路由
我们可以把蓝图理解成一个没有run方法的flask对象,每个蓝图都可以为自己独立出一套templates模板文件夹,也可以独立出静态文件目录,如果不独立出来的话,则会共享项目中的
所以,蓝图中的参数也有template_folder , static_folder等
 
特殊装饰器:
1, before_request : 在请求进入视图函数之前
@app.befroe_request也是一个装饰器,它装饰的函数,都会在请求进入视图函数之前执行,我们最常用到的就是用它来校验登录认证
from flask import Flask
from flask import request
from flask import redirect
from flask import session

app = Flask(__name__)  # type:Flask
app.secret_key = "DragonFire"

@app.before_request
def is_login():
    if request.path == "/login":
        return None

    if not session.get("user"):
        return redirect("/login")

@app.route("/login")
def login():
    return "Login"

@app.route("/index")
def index():
    return "Index"

@app.route("/home")
def home():
    return "Login"

app.run("0.0.0.0", 5000)
2, after_request : 在响应返回客户端之前执行
这个一般使用情况比较少
flask的请求响应顺序跟django的中间件是有区别的,django是一是一对应的,在哪个中间件拦截,就会在对应的中间件返回去,而flask中,如果在某一个before_request中断的话,也会走全部的after_request
我们举个例子,假如说我们写了1,2,3,三个before_request,我们用be1,be2,be3来表示三个函数
还有1,2,3,三个after_request,我们用af1,af2,af3表示,那么他们的顺序如下:
正常情况下流程:be1 - be2 - be3 - af3 - af2 - af1
异常情况下流程:be1 - af3 - af2 - af1
3, @app.errorhandler(404) # 重定义错误页面返回信息
def error404(error_info):
return 三剑客+小儿子