在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如:

  • 在请求开始时,建立数据库连接;
  • 在请求开始时,根据需求进行权限校验;
  • 在请求结束时,指定数据的交互格式;

为了让每个视图函数避免编写重复功能的代码,Flask提供了通用功能,即请求钩子。

请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:

before_first_request

功能:

  • 只在第一个请求之前调用,第一个请求之后不再调用。

作用:

  • 可以在里面进行一些初始化操作,比如:连接数据库

注意:

  • “第一次”不是指用户第一次发起请求,而是服务器第一次接收到请求。
# 被该装饰器装饰的函数会在第一次请求之前调用。
# 强调:第一次不是指用户第一次发起请求,而是服务器第一次接收到请求。
# 作用:可以在此方法内部做一些初始化操作,比如连接数据库
@app.before_first_request
def before_first_request():
print("before_first_request 被执行")

before_request

功能:

  • 在每次请求的之前调用

作用:

  • 可以获取用户的session信息
  • 可以做一些请求校验,如果请求的校验不成功,可以使用return不执行视图函数

注意点:

  • 使用了return ,响应的状态码就变成了200,如果用户输入不存在的路由,且校验不通过,将不会返回404
# 被该装饰装饰的函数会在每一次请求之前调用
# 作用:可以在这个请求中做一些请求校验,如果请求的校验不成功,直接return之后那么就不会执行视图函数
@app.before_request
def before_request():
print("before_request 被执行")

after_request

功能:

  • 在每次请求之后,且视图函数被成功执行完之后调用
  • 需要传入一个参数,这个参数实际上为服务器的响应对象,并返回一个新的Response对象或者直接返回接受到的Response 对象

作用:

  • 可以在此方法中对响应做最后一步统一的处理,比如修改headers信息
# 被该装饰器装饰的函数会在视图被成功执行完之后调用,并且会把视图函数return的数据当做参数传入
# 作用:可以在此方法中对响应做最后一步统一的处理,比如修改headers信息
@app.after_request
def after_request(resp):
print("after_request 被执行")
resp.headers["Content-Type"] = "application/json"
return resp

teardown_request

功能:

  • 在每次请求之后调,无论视图函数是否执行成功,均调用

作用:

  • 可以用来收集错误信息
# 被该装饰器装饰的函数无论每一次请求是否成功都会调用
# 会接受一个参数,若视图执行出错,参数是服务器出现的错误信息,反之,为None
# 作用:可以用来收集错误
@app.teardown_request
def teardown_request(error):
print("teardown_request 被执行")
if error:
print(F"错误URL:{request.url},错误原因:{error}")
return app

运行结果图:

 

根据运行结果, 可以得出钩子函数在一次请求中的执行顺序, 如下图:

附码:

钩子管理文件,文件名为 app_init.py

from flask import Flask, request

def create_app():
app = Flask(__name__) # 被该装饰器装饰的函数会在第一次请求之前调用。
# 强调:第一次不是指用户第一次发起请求,而是服务器第一次接收到请求。
# 作用:可以在此方法内部做一些初始化操作,比如连接数据库
@app.before_first_request
def before_first_request():
print("before_first_request 被执行") # 被该装饰装饰的函数会在每一次请求之前调用
# 作用:可以在这个请求中做一些请求校验,如果请求的校验不成功,直接return之后那么就不会执行视图函数
@app.before_request
def before_request():
print("before_request 被执行") # 被该装饰器装饰的函数会在视图被成功执行完之后调用,并且会把视图函数return的数据当做参数传入
# 作用:可以在此方法中对响应做最后一步统一的处理,比如修改headers信息
@app.after_request
def after_request(resp):
print("after_request 被执行")
resp.headers["Content-Type"] = "application/json"
return resp # 被该装饰器装饰的函数无论每一次请求是否成功都会调用
# 会接受一个参数,若视图执行出错,参数是服务器出现的错误信息,反之,为None
# 作用:可以用来收集错误
@app.teardown_request
def teardown_request(error):
print("teardown_request 被执行")
if error:
print(F"错误URL:{request.url},错误原因:{error}")
return app

视图函数文件

# 请求钩子在 app_init.py 中被定义
from app_init import create_app app = create_app() @app.route("/login/")
def login():
print("login视图被执行")
return "登录成功" @app.route("/create/")
def create():
print("create视图被执行")
return "创建成功" @app.route("/error/")
def error():
print("error视图被执行")
a = 1/0
return "ok" if __name__ == '__main__':
app.run()

参考:

https://blog.csdn.net/dakengbi/article/details/94437972

https://blog.csdn.net/f704084109/article/details/80932126

Flask_请求钩子(七)的更多相关文章

  1. 02 flask 请求钩子、异常捕获、上下文、Flask-Script 扩展、jinja2 模板引擎、csrf防范

    一 请求勾子 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: 在请求开始时,建立数据库连接: 在请求开始时,根据需求进行权限校验: 在请求结束时,指定数据的交互格式: 为了让每个 ...

  2. (三)flask中的请求钩子函数

    请求勾子 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: 在请求开始时,建立数据库连接: 在请求开始时,根据需求进行权限校验: 在请求结束时,指定数据的交互格式: 为了让每个视图 ...

  3. flask请求钩子、HTTP响应、响应报文、重定向、手动返回错误码、修改MIME类型、jsonify()方法

    请求钩子: 当我们需要对请求进行预处理和后处理时,就可以用Flask提供的回调函数(钩子),他们可用来注册在请求处理的不同阶段执行的处理函数.这些请求钩子使用装饰器实现,通过程序实例app调用,以 b ...

  4. Flask--四种请求钩子函数

    请求钩子函数:请求前,请求后需要做的处理 @app.before_first_request-在第一次请求之前执行 @app.before_request-在每一次请求之前执行 @app.after_ ...

  5. flask基础之请求钩子(十二)

    前言 什么是请求钩子?在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要统一处理,为了让每个视图函数避免编写重复功能的代码,flask提供了统一的接口可以添加这些处理函数,即请求钩子. 请求钩子 ...

  6. falsk 请求钩子

    请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:before_first_request在处理第一个请求前执行before_request在每次请求前执行如果在某修饰的函数中返回了一个 ...

  7. Flask框架 之上下文、请求钩子与Flask_Script

    一.上下文 请求上下文:request与session 应用上下文:current_app与g:一次请求多个函数可以用它传参 @app.route("/") def index() ...

  8. Flask 中请求钩子的理解和应用?

    请求钩子是通过装饰器的形式实现的,支持以下四种:1,before_first_request 在处理第一个请求前运行2,before_request:在每次请求前运行3,after_request:如 ...

  9. Flask的请求钩子与上下文简览

    请求钩子(Hook) 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如:在请求开始时,建立数据库连接:在请求结束时,指定数据的交互格式.为了让>每个视图函数避免编写重复功能的代 ...

随机推荐

  1. ClassLoader.loadClass()与Class.forName()的区别《 转》

    ClassLoader.loadClass()与Class.forName()区别: ClassLoader.loadClass()与Class.forName()大家都知道是反射用来构造类的方法,但 ...

  2. linux系统下命令的学习

    本博客是本人工作时做的笔记 ps aux |grep ^profile |grep A190200024 ^ 表示行首匹配 linux查看文件大小: 具体可查看:https://www.cnblogs ...

  3. HTTPS及流程简析

    [序] 在我们在浏览某些网站的时候,有时候浏览器提示需要安装根证书,可是为什么浏览器会提示呢?估计一部分人想也没想就直接安装了,不求甚解不好吗? 那么什么是根证书呢?在大概的囫囵吞枣式的百度之后知道了 ...

  4. JAVA日志发展史

    JAVA日志发展史 第一阶段 2001年以前,Java是没有日志库的,打印日志全凭System.out和System.err 缺点: 产生大量的IO操作同时在生产环境中无法合理的控制是否需要输出 输出 ...

  5. 从一次解决Nancy参数绑定“bug”开始发布自己的第一个nuget包(上篇)

    起因 最近,同事跟我说,他们负责的一个Api程序出现了一些很奇怪的事情.这个Api是为环保局做的一个扬尘质控大屏提供数据的,底层是基于Nancy做的.因为发现有些接口的数据出现异常,他就去调试了一下, ...

  6. Google Earth Engine 批量点击RUN任务,批量取消正在上传的任务

    本文内容参考自: https://blog.csdn.net/qq_21567935/article/details/89061114 https://blog.csdn.net/qq_2156793 ...

  7. 存储技术之ceph了解

    ceph rados:可靠的.自动的.分布式.对象存储 特性:高效性,统一性(文件存储,块存储,对象存储),可扩展 没有数据库的概念:为cluster map 记录集群状态. PG:(ceph核心单位 ...

  8. 当PowerDesigner的工具栏不见时候该怎么调出来

    当PowerDesigner的工具栏不见时候该怎么调出来,如下所示:选中[Palette]便可

  9. thinkphp 5 在页面输出当前时间

    我遇到的使用场景是<input>默认为当前时间,代码如下: <input name="starttime" id="starttime" ty ...

  10. JAVA获取某年(当年)的第一天的开始时刻和某年(当年)的最后一天的最后时刻

    package com.date; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Dat ...