1-8-flask框架-框架-钩子函数
前言:
还记得对请求的session校验吗?
我们使用了装饰器来做的,这样每一个视图都要加装饰器,
Django里面是使用的中间件来做的, 那么flask可以使用中间件来做吗?
Flask之钩子函数
类似django的中间件,作用就是在进入框架的之后 http方法之前或返回response之前进行一些操作
Flask的钩子函数可在注册时根据注册的app或者蓝图从而确定钩子函数作用的范围(可全局 也可作用某一个蓝图)
常用的钩子函数
@before_first_request
在对应用程序实例的第一个请求之前注册要运行的函数,只会运行一次
格式:
@App.before_app_first_request
def before_app_first_request():
pass
@before_request
在每个请求之前注册一个要运行的函数,每一次请求都会执行一次
格式:
@App.before_app_request
def before_app_request():
pass
第一点:不使用自己写装饰器,使用的是app的一个装饰器before_request
第二点,要注意,登陆页面是不需要登陆的,加一个白名单过滤
第三点,return None就是什么都不做,继续往下走
第四点,return 有内容,就是不往下走了,就停在这里了,
第五点,可以是针对整个flask的所有请求,@app.before_request,
也可以针对单个蓝图的请求,@蓝图.before_request
也可以在蓝图中针对整个app的请求,@蓝图.before_app_request
from flask import Flask,request,session,redirect
app = Flask(__name__)
@app.before_request
def process_request(*args, **kwargs):
if request.path == '/login':
return None
user = session.get('user_info')
if user:
return None
return redirect('/login')
@after_request
在每个请求之后注册一个要运行的函数,每次请求完成后都会执行。
需要接受一个Response对象作为参数,并返回一个新的Response对象,或者返回接收的Response对象
@App.after_request
def after_request(response):
pass
return response
可以添加多个,但是注意顺序
before,是按照顺序
after,是按照倒序,
和套娃一样,这也是Python装饰器的执行顺序,
请求的处理过程:pre_process -> view -> after_process
@teardown_request
注册在每一个请求的末尾,不管是否有异常,每次请求的最后都会执行。
@context_processor
上下文处理器,返回的字典可以在全部的模板中使用
@template_filter('xxxxxx')
增加模板过滤器,可以在模板中使用该函数,后面的参数是名称,在模板中用到
@errorhandler(400)
发生一些异常时,比如404,500,或者抛出异常(Exception)之类的,就会自动调用该钩子函数
1.发生请求错误时,框架会自动调用相应的钩子函数,并向钩子函数中传入error参数
2.如果钩子函数没有定义error参数,就会报错
3.可以使用abort函数来手动终止请求抛出异常,如果要是发生参数错误,可以abort(404)之类的
这个可以根据状态码来定制,404,500都可以定制,
总结,
最常用的就是before_request,after_request