钩子函数
函数 钩子
2023-06-13 09:12:34 时间
一、概述
类似于Django中的中间件,使用需要用对应的钩子装饰器的函数
二、App对象使用
- before_first_request 第一次请求之前
- 参数:没有参数
- 返回值 None 请求可以继续进行 response对象 终止本次请求,直接返回
- before_request 每次请求之前
- 参数:没有参数
- 返回值 None 请求可以继续进行 response对象 终止本次请求,直接返回
- after_request
- 参数:视图中创建的response对象
- 返回值 response对象 可以在返回前修改响应
- teardown_request 每次请求之后,即使有异常发生 需要将debug关闭
- 参数:exception错误信息
- 返回值 None 请求可以继续进行
实例
<span class="hljs-meta">@app.before_first_request</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">beforeFirstRequest</span><span class="hljs-params">()</span>:</span>
print(<span class="hljs-string">"----beforeFirstRequest----"</span>)
<span class="hljs-keyword">return</span> render_template(<span class="hljs-string">'index.html'</span>)
<span class="hljs-meta">@app.before_request</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">beforeRequest</span><span class="hljs-params">()</span>:</span>
print(<span class="hljs-string">"-------------before"</span>)
<span class="hljs-comment"># 验证验证</span>
<span class="hljs-comment"># 获取前端发送的验证码</span>
<span class="hljs-comment"># 获取session中的验证码</span>
<span class="hljs-comment"># 判断两者是否相同,相同返回None,否则重定向会登陆界面</span>
<span class="hljs-comment"># 验证是否登录</span>
<span class="hljs-comment"># 获取状态保持相关信息(账号)</span>
<span class="hljs-comment"># 如果没有状态保持说明没有登陆,重定向登陆界面</span>
<span class="hljs-comment"># 根据状态保持的账号获取用户对象</span>
<span class="hljs-comment"># 获取客户端发送的cookie中的键为token的值</span>
<span class="hljs-comment"># 如果没有说明没有登陆,重定向登陆界面</span>
<span class="hljs-comment"># 判断用户中的token与cookie中的token值是否相同,不相同则重定向登陆界面</span>
三、蓝本对象中使用
参数与返回值同上
钩子函数 | 功能描述 |
---|---|
before_app_first_request | 第一次请求之前 |
before_app_request | 每次请求之前 |
after_app_request | 每次请求之后,前提是没有异常 |
teardown_app_request | 每次请求之后,即使有异常发生 需要将debug关闭 |
实例
<span class="hljs-keyword">from</span> flask <span class="hljs-keyword">import</span> g,request, Blueprint
hook = Blueprint(<span class="hljs-string">'hook'</span>, __name__)
<span class="hljs-meta">@hook.route("/gouzi/")</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">hook</span><span class="hljs-params">()</span>:</span>
print(<span class="hljs-string">"----hook----"</span>)
<span class="hljs-keyword">return</span> <span class="hljs-string">"gouzi"</span>
<span class="hljs-meta">@hook.before_app_first_request</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">beforeFirstRequest</span><span class="hljs-params">()</span>:</span>
print(<span class="hljs-string">"----beforeFirstRequest----"</span>)
<span class="hljs-meta">@hook.before_app_request</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">beforeRequest</span><span class="hljs-params">()</span>:</span>
<span class="hljs-keyword">if</span> request.method == <span class="hljs-string">'GET'</span> <span class="hljs-keyword">and</span> request.path == <span class="hljs-string">'/form/'</span>:
abort(<span class="hljs-number">500</span>) <span class="hljs-comment">#如果传递方式为get 并且请求的是 form的路由 则禁止请求</span>
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> request.headers.get(<span class="hljs-string">'User-Agent'</span>) <span class="hljs-keyword">or</span> <span class="hljs-keyword">not</span> request.host == <span class="hljs-string">'127.0.0.1:5000'</span>:
abort(<span class="hljs-number">500</span>)
print(<span class="hljs-string">"----beforeRequest----"</span>)
g.a = <span class="hljs-string">"good man"</span>
<span class="hljs-meta">@hook.after_app_request</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">afterRequest</span><span class="hljs-params">(response)</span>:</span>
print(<span class="hljs-string">"----afterRequest----"</span>)
print(g.a)
<span class="hljs-keyword">return</span> response
<span class="hljs-meta">@hook.teardown_app_request</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">teardownRequest</span><span class="hljs-params">(exception)</span>:</span>
print(<span class="hljs-string">"----teardownRequest----"</span>)
print(exception)
四、仿照Django中的中间件
应用目录下创建middlewares包目录,每个功能实现以个中间件(每个功能是一个py文件)
在middlewares目录下创建中间件文件
<span class="hljs-keyword">from</span> flask <span class="hljs-keyword">import</span> request
<span class="hljs-keyword">from</span> flask <span class="hljs-keyword">import</span> session
<span class="hljs-keyword">from</span> flask <span class="hljs-keyword">import</span> g
<span class="hljs-comment">#参数:蓝图对象</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">verifycodeMiddleware</span><span class="hljs-params">(blueprint)</span>:</span>
<span class="hljs-meta"> @blueprint.before_app_request</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">before</span><span class="hljs-params">()</span>:</span>
print(<span class="hljs-string">"------验证验证码-------"</span>)
注册中间件(蓝图文件中)
<span class="hljs-comment"># 注册中间件</span>
<span class="hljs-keyword">from</span> myApp.middlewares <span class="hljs-keyword">import</span> verifycodeMiddleware
verifycodeMiddleware(myApp)
如果卸载app.py中代码如下
<span class="hljs-keyword">from</span> flask <span class="hljs-keyword">import</span> request
<span class="hljs-keyword">from</span> flask <span class="hljs-keyword">import</span> session
<span class="hljs-keyword">from</span> flask <span class="hljs-keyword">import</span> g
<span class="hljs-comment">#参数:蓝图对象</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">verifycodeMiddleware</span><span class="hljs-params">(app)</span>:</span>
<span class="hljs-meta"> @app.before_request</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">before</span><span class="hljs-params">()</span>:</span>
print(<span class="hljs-string">"****验证验证码****"</span>)
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">create_app</span><span class="hljs-params">()</span>:</span>
verifycodeMiddleware(app)
相关文章
- C语言之malloc函数「建议收藏」
- Py之cv2:cv2库(OpenCV,opencv-python)的简介、安装、使用方法(常见函数、方法等)最强详细攻略[通俗易懂]
- Vue进阶(十八):router.beforeEach 与 router.afterEach 钩子函数
- Python中两个重要的辅助函数
- Django(8)reverse函数「建议收藏」
- sql中listagg用法_listagg是不是公开的函数
- vue钩子函数
- 生命周期钩子函数
- Postgreqsql动态加载plpgsql钩子函数的实例(调试利器)
- oracle trunc()函数的使用方法
- ROW_NUMBER() OVER函数使用方法详解数据库
- 模板模式和钩子函数详解架构师
- Oracle 函数之旅:精彩不断(oracle的函数)
- Linux 内置函数atoi的作用(linuxatoi)
- MySQL中如何使用max函数来获取最大值(mysql 中max函数)
- MySQL中使用IN函数的查询限制是什么(mysql中in的限制)
- 函数MySQL函数的精彩之旅体验21种不同的函数(21种mysql)
- Oracle数据库函数编写技巧(oracle中函数写法)
- jQuery学习7操作JavaScript对象和集合的函数
- JQuery之focus函数使用介绍
- php取整函数ceil,floo,round的用法及介绍
- python中使用sys模板和logging模块获取行号和函数名的方法
- ASP转换格林威治时间函数DateDiff()应用