共计 2092 个字符,预计需要花费 6 分钟才能阅读完成。
一、概述
类似于 Django 中的中间件,使用需要用对应的钩子装饰器的函数
二、App 对象使用
-
before_first_request 第一次请求之前
-
参数:没有参数
-
返回值
None 请求可以继续进行
response 对象 终止本次请求,直接返回
-
-
before_request 每次请求之前
-
参数:没有参数
-
返回值
None 请求可以继续进行
response 对象 终止本次请求,直接返回
-
-
after_request
-
参数:视图中创建的 response 对象
-
返回值
response 对象 可以在返回前修改响应
-
-
teardown_request 每次请求之后,即使有异常发生 需要将 debug 关闭
-
参数:exception 错误信息
-
返回值
None 请求可以继续进行
-
实例
@app.before_first_request
def beforeFirstRequest():
print("----beforeFirstRequest----")
return render_template('index.html')
@app.before_request
def beforeRequest():
print("-------------before")
# 验证验证
# 获取前端发送的验证码
# 获取 session 中的验证码
# 判断两者是否相同,相同返回 None,否则重定向会登陆界面
# 验证是否登录
# 获取状态保持相关信息 (账号)
# 如果没有状态保持说明没有登陆,重定向登陆界面
# 根据状态保持的账号获取用户对象
# 获取客户端发送的 cookie 中的键为 token 的值
# 如果没有说明没有登陆,重定向登陆界面
# 判断用户中的 token 与 cookie 中的 token 值是否相同,不相同则重定向登陆界面
三、蓝本对象中使用
参数与返回值同上
钩子函数 | 功能描述 |
---|---|
before_app_first_request | 第一次请求之前 |
before_app_request | 每次请求之前 |
after_app_request | 每次请求之后,前提是没有异常 |
teardown_app_request | 每次请求之后,即使有异常发生 需要将 debug 关闭 |
实例
from flask import g,request, Blueprint
hook = Blueprint('hook', __name__)
@hook.route("/gouzi/")
def hook():
print("----hook----")
return "gouzi"
@hook.before_app_first_request
def beforeFirstRequest():
print("----beforeFirstRequest----")
@hook.before_app_request
def beforeRequest():
if request.method == 'GET' and request.path == '/form/':
abort(500) # 如果传递方式为 get 并且请求的是 form 的路由 则禁止请求
if not request.headers.get('User-Agent') or not request.host == '127.0.0.1:5000':
abort(500)
print("----beforeRequest----")
g.a = "good man"
@hook.after_app_request
def afterRequest(response):
print("----afterRequest----")
print(g.a)
return response
@hook.teardown_app_request
def teardownRequest(exception):
print("----teardownRequest----")
print(exception)
四、仿照 Django 中的中间件
-
应用目录下创建 middlewares 包目录,每个功能实现以个中间件 (每个功能是一个 py 文件)
-
在 middlewares 目录下创建中间件文件
from flask import request from flask import session from flask import g # 参数:蓝图对象 def verifycodeMiddleware(blueprint): @blueprint.before_app_request def before(): print("------ 验证验证码 -------")
-
注册中间件 (蓝图文件中)
# 注册中间件 from myApp.middlewares import verifycodeMiddleware verifycodeMiddleware(myApp)
-
如果卸载 app.py 中代码如下
from flask import request from flask import session from flask import g # 参数:蓝图对象 def verifycodeMiddleware(app): @app.before_request def before(): print("**** 验证验证码 ****") def create_app(): verifycodeMiddleware(app)
正文完
星哥玩云-微信公众号