Flask 请求钩子

简介: Flask 请求钩子

引言

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

  • 在请求开始时,建立数据库连接
  • 在请求开始时,进行登陆权限认证
  • 在请求结束时,指定数据的交互格式

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

<br/>

Flask请求钩子

请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:
  • before_first_request: 在第一次请求处理之前先被执行
  • before_request: 在每次请求前执行,如果在某修饰的函数中返回了一个响应,视图函数将不再被调用
  • after_request: 在每次请求处理之后被执行

    • 接受一个参数:视图函数的响应
    • 在此函数中可以对响应值在返回之前做最后一步修改处理
    • 需要将参数中的响应在此参数中进行返回
  • teardown_request: 在每次请求后执行,接受一个参数:错误信息

    • 需要在非调式模式下运行

<br/>

代码测试

"""
Author: Hui
Desc: { 了解 Flask 请求钩子 }
"""
from flask import Flask

app = Flask(__name__)


@app.route("/index")
def index():
    print("index called")
    a = 1 / 0
    response = '{"name": "hui"}'
    return response


@app.route("/hello")
def hello():
    print("hello called")
    return {'welcome': 'hello'}


@app.before_first_request
def handle_before_first_request():
    """
    在第一次请求处理之前先被执行
    """
    print("handle_before_first_request called")


@app.before_request
def handle_before_request():
    """
    在每次请求处理之前都被执行
    """
    print("handle_before_request called")


@app.after_request
def handle_after_request(response):
    """
    在每次请求处理之后被执行
    :param response: 视图函数处理之后返回的响应
    """
    print("handle_after_request called")
    # 指定响应返回格式类型为 json
    # response.headers['Content-Type'] = 'application/json'
    print(response)
    return response


@app.teardown_request
def handle_teardown_request(errors):
    """
    在每次请求处理之后都被执行,有没有异常都执行
    工作在非调试模式下(生产模式)
    :param: errors: 服务器出错的信息, 没有错误则为 None
    """
    print("handle_teardown_request called")
    print(errors)


if __name__ == "__main__":
    app.run()

<br/>

先访问 /hello

启动程序,先访问 http://127.0.0.1:5000/hello

访问/hello

看看 PyCharm 输出的结果

handle_before_first_request called    # Web应用第一次请求时

handle_before_request called    # 在每次请求前

hello called    # 视图函数打印的结果

handle_after_request called        # 在请求处理之后
<Response 20 bytes [200 OK]>

handle_teardown_request called
None    # 没有异常,打印的结果

127.0.0.1 - - [07/May/2021 23:32:25] "GET /hello HTTP/1.1" 200 -

<br/>

后访问 /index

然后再访问有 除0异常 的视图函数,http://127.0.0.1:5000/index

访问/index

PyCharm 打印的结果

handle_before_request called

index called    # 视图函数打印的结果

handle_after_request called
<Response streamed [500 INTERNAL SERVER ERROR]>

handle_teardown_request called
division by zero

[2021-05-07 23:32:40,479] ERROR in app: Exception on /index [GET]

<br/>

可以发现 before_first_request 请求钩子没有执行,它只会处理Flask应用程序的第一次的请求,之后的请求都不会执行这个请求钩子。

在出现异常情况的下 after_request 打印的响应结果,状态码 500 的服务器出错的响应,这个是Flask内置的一个响应结果。

teardown_request 则接受到了异常信息,输出了 division by zero 除0异常。

如果把 调试模式 Debug mode 打开,看看 teardown_request 是不是只运行在 非调试模式下

我们可以在 PyCharm 中编辑 Flask 配置信息

编辑Flask配置信息

<br/>

Flask配置

<br/>

我这里开启了调试模式和指定了 IP和端口为 127.0.0.1:8000

启动 Flask 程序再次访问 http://127.0.0.1:8000/index,网页显示如下

调试模式下错误响应

<br/>

开启了调试模式,网页会输出具体错误信息。

然后再看看 PyCharm 输出结果

handle_before_first_request called

handle_before_request called

index called

127.0.0.1 - - [08/May/2021 00:10:13] "GET /index HTTP/1.1" 500 -

<br/>

teardown_request 请求钩子,没有执行,可以说明其工作在非调试模式下。

<br/>

源代码

源代码已上传到 Gitee HuiDBK/FlaskBasic,欢迎大家来访。

✍ 码字不易,还望各位大侠多多支持❤️。

<br/>

公众号

新建文件夹X

大自然用数百亿年创造出我们现实世界,而程序员用几百年创造出一个完全不同的虚拟世界。我们用键盘敲出一砖一瓦,用大脑构建一切。人们把1000视为权威,我们反其道行之,捍卫1024的地位。我们不是键盘侠,我们只是平凡世界中不凡的缔造者 。
相关文章
扒源码 - 一个请求在flask中经历了什么
客户端发起一个请求,Flask 都干了什么呢?url 如何与视图进行绑定的?
|
1月前
|
JSON 中间件 数据格式
五、Flask的请求和响应方法与常用技巧
五、Flask的请求和响应方法与常用技巧
75 0
|
6月前
|
前端开发 数据库 Python
使用 Python 的 Web 框架(如 Django 或 Flask)来建立后端接口,用于处理用户的请求,从数据库中查找答案并返回给前端界面
【1月更文挑战第13天】使用 Python 的 Web 框架(如 Django 或 Flask)来建立后端接口,用于处理用户的请求,从数据库中查找答案并返回给前端界面
244 7
|
5月前
|
JSON API 数据格式
如何使用Flask request对象处理请求
在 Flask 中,request对象是处理 HTTP 请求的重要工具之一。它提供了许多属性和方法,可以帮助我们获取请求的相关信息和数据。本文将向你介绍request对象的常用方法以及如何在 Flask 应用程序中使用它。
104 3
|
6月前
|
网络架构 Python
在Flask中,如何定义路由并处理HTTP请求的不同方法(GET、POST等)?
【4月更文挑战第25天】在Flask中,使用`@app.route()`装饰器定义路由,如`/hello`,处理GET请求返回&#39;Hello, World!&#39;。通过添加`methods`参数,可处理不同HTTP方法,如POST请求。单一函数可处理多种方法,通过检查`request.method`区分。动态路由使用 `&lt;variable_name&gt;` 传递URL变量到视图函数。这些基础构成处理HTTP请求的Flask应用。
101 1
|
6月前
|
JSON 数据格式 Python
如何在Flask框架中定义路由和处理请求?
【4月更文挑战第18天】在Flask框架中,创建应用实例、定义路由和处理请求涉及5个步骤:1) 导入Flask并实例化应用;2) 使用`app.route()`装饰器定义路由,指定URL和HTTP方法;3) 编写视图函数处理请求逻辑;4) 视图函数返回响应内容,Flask会自动转换格式;5) 用`app.run()`启动服务器。
93 3
|
6月前
|
存储 JSON 数据安全/隐私保护
Flask Python:如何获取不同请求方式的参数
Flask Python:如何获取不同请求方式的参数
330 0
|
6月前
|
网络协议 测试技术 Python
PythonWeb开发基础(三)类Flask框架请求封装
类Flask框架请求封装 Web服务器 本质是个TCP服务器,监听在特定端口上 支持HTTP协议,能够将HTTP请求报文进行解析,能够把响应数据进行HTTP协议的报文封装并返回浏览器端。
84 0
|
11月前
|
JSON 数据格式 Python
flask 接收get请求, 以及返回 json格式
flask 接收get请求, 以及返回 json格式
106 0
|
中间件 测试技术 数据库
软件测试|测试平台开发-Flask 入门:Flask HTTP请求详解
软件测试|测试平台开发-Flask 入门:Flask HTTP请求详解