Flask 请求的生命周期

一、请求生命周期

Flask 请求的生命周期涉及到整个处理请求的过程,包括请求的接收、视图函数的执行、响应的生成和发送等。以下是一个简要的 Flask 请求生命周期的概述:

  • WSGI 服务器调用 Flask 对象,该对象调用 Flask.wsgi_app() 。

  • 一个 RequestContext 对象被创建,将 WSGI environ 字典转换为一个 Request 对象。它还创建一个 AppContext 对象。

  • app context 被推送,这使得 current_app 和 g 可用。

  • 发送 appcontext_pushed 信号。

  • request context 被推送,这使得 request 和 session 可用。

  • 会话被打开,使用应用程序的 session_interface ,一 个 SessionInterface 实例,载入所有现存的会话数据。

  • 将 URL 与在应用设置期间使用 route() 装饰器注册的 URL 规则进行匹配。如果没有匹配项,则错误(通常是 404 、405 或重 定向)被存储以供以后处理。

  • 发送 request_started 信号。

  • 调用所有 url_value_preprocessor() 装饰的函数。

  • 调用所有 before_request() 装饰的函数。如果有任何返回值,那么就立即被视为响应。

  • 如果 URL 在几个步骤前与路由不匹配,则现在会引发该错误。

  • 与匹配的 URL 关联的 route() 装饰器视图函数 被调用并返回要用作响应的值。

  • 如果到目前为止的任何步骤引发了异常,并且有一个 errorhandler() 装饰器函数与异常类或 HTTP 错误代码匹 配,那么调用它处理错误并返回响应。

  • 不管是请求前函数、视图或错误处理程序,都会返回一个响应值,并被转换为 Response 对象。

  • 任何 after_this_request() 装饰的函数都会被调用,然后被清除。

  • 任何 after_request() 装饰的函数都会被调用,它们可以 修改响应对象。

  • 会话被保存,使用应用程序的:attr:~.Flask.session_interface 装饰 函数来持久化任何已修改的会话数据。

  • request_finished 信号被发送。

  • 如果到目前为止的任何步骤引发了一个异常,并且没有被错误处理函数处 理,那么现在会被处理。 HTTP 异常会使用对应的状态代码作为响应,其他的异常被转换为一个通用的 500 响应。 got_request_exception 信号被发送。

  • 响应对象的状态、头部信息和正文被返回给 WSGI 服务器。

  • 任何 teardown_request() 装饰的函数都被调用。

  • request_tearing_down 信号被发送。

  • 请求上下文被弹出, request 和 session 不再可用。

  • 任何 teardown_appcontext() 的装饰函数都被调用。

  • appcontext_tearing_down 信号被发送。

  • 应用上下文被弹出, current_app 和 g 不再可用。

  • appcontext_popped 信号被发送。

还有更多的装饰器和定制点,但它们并不是每个请求生命周期都有。它们更多的是针对在请求过程中可能使用的某些东西,如模板、构建URL 或处理 JSON 数据。

二、钩子函数

上文提到了多个Flask 提供的多个钩子函数,这些钩子函数允许你在请求处理的不同阶段插入自定义逻辑。以下是一些常用的 Flask 钩子函数的用法:

  1. before_first_request

    • 在处理第一个请求之前执行一次,通常用于初始化应用。
    from flask import Flaskapp = Flask(__name__)@app.before_first_request
    def before_first_request():print("This runs before the first request.")
  2. before_request

    • 在每次请求之前执行,可用于执行一些全局的预处理工作。
    from flask import Flaskapp = Flask(__name__)@app.before_request
    def before_request():print("This runs before each request.")
  3. after_request

    • 在每次请求之后执行,可用于修改响应对象。
    from flask import Flaskapp = Flask(__name__)@app.after_request
    def after_request(response):print("This runs after each request.")return response
  4. teardown_request

    • 在每次请求之后执行,无论是否发生异常。通常用于清理资源。
    from flask import Flaskapp = Flask(__name__)@app.teardown_request
    def teardown_request(exception):print("This runs after each request, even if an exception occurred.")
  5. before_render_template

    • 在渲染模板之前执行,可以用于在模板渲染之前注入一些全局数据。
    from flask import Flask, render_templateapp = Flask(__name__)@app.before_render_template
    def before_render_template(template, context):print("This runs before rendering the template.")context['global_variable'] = 'I am a global variable.'
  6. template_rendered

    • 在模板渲染之后执行,用于执行一些与模板渲染相关的操作。
    from flask import Flask, render_templateapp = Flask(__name__)@app.template_rendered
    def template_rendered(template, context):print("This runs after rendering the template.")
  7. url_value_preprocessor

    • 注册 URL 变量预处理函数,可以在请求处理之前对 URL 变量进行处理。
    from flask import Flask, url_forapp = Flask(__name__)@app.url_value_preprocessor
    def url_value_preprocessor(endpoint, values):print("This runs before processing the URL values.")# You can modify the values dictionary here.

这只是一小部分 Flask 钩子函数的示例,Flask 提供的钩子函数非常灵活,你可以根据需要选择合适的钩子来插入自定义逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/203087.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows如何解决端口冲突(实用篇)

在项目设计中,环境配置成功点击运行瞬间,一大堆红爆出,8080端口占用,这个是很烦人的。。。 解决方式: 笨方法:一、查看所有端口实用情况(挨个扫) 按住【WINR】快捷键打开运行输入…

处理实时视频流:第三方美颜SDK的实时图像处理策略

为了提高用户体验,许多应用和平台开始采用第三方美颜SDK,通过先进的图像处理技术实时改善视频中的面部外观。本文将深入探讨这些第三方美颜SDK在实时视频流处理中所采用的图像处理策略,揭示其背后的技术原理和创新。 一、引言 实时视频流处理…

P6 Linux 系统中的文件类型

目录 前言 ​编辑 01 linux系统查看文件类型 02 普通文件 - 03 目录文件 d 04 字符设备文件 c 和块设备文件 b 05 符号链接文件 l 06 管道文件 p 07 套接字文件 s 总结 前言 🎬 个人…

微信小程序中全局变量的应用

为什么要使用全局变量的应用呢,例如在播放音乐的时候,我们跳转到其他的页面上,那我们当前的音乐是否要继续播放呢????所以我们就使用到了全局变量的应用。 在微信小程序中,可以通过…

在cmd下查看当前python的版本

在cmd窗口下运行python --version或者py --version,可以查看当前python的版本。例如:

Android 10.0 SystemUI定制之通过系统属性控制锁屏页面通知栏显示与隐藏功能实现

1.前言 在10.0的系统产品开发中,在一些SystemUI的系统定制化开发中,在对锁屏页面的通知栏在某些情况下不需要显示通知栏,所以就需要 在systemui的通知栏布局页面中,通过属性来控制是否在锁屏页面的时候显示通知,具体就分析下systemui然后开发相关功能 2.SystemUI定制之通…

unity 2d 入门 飞翔小鸟 飞翔脚本(五)

新建c#脚本 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Fly : MonoBehaviour {//获取小鸟(刚体)private Rigidbody2D bird;//速度public float speed;// Start is called before the first frame up…

配置和管理VLAN

VLAN技术是交换技术的重要组成部分,也是交换机配置的基础。用于把物理上直接相连的网络从逻辑上划分为多个子网。 每一个VLAN 对应一个广播域,处于不同VLAN 上的主机不能通信。 不同VLAN 之间通信需要引入三层交换技术。 对性能局域网的配置和管理主要…

H5ke13-1浏览器处理异常

window对应的error没有event对象 window对应的error他接收三个参数,msg,url,行号 return false return true 1就不会返回错误 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>Title</title>&…

7-tornado中Url设置、RequestHandler的使用、重定向 RedirectHandler、静态文件 StaticFileHandler

1 URL设置 url地址可以如下操作&#xff1a; 1. 完整匹配&#xff0c;跳转控制器 2. 通过re匹配&#xff0c;跳转控制器 3. 通url传递参数 4. 跳转 4.1 url 反转 使用web.URLSpec中的name属性&#xff0c;在处理函数中使用reverse_url from tornado import web,ioloopclass I…

【PyTorch】训练过程可视化

文章目录 1. 训练过程中的可视化1.1. alive_progress1.2. rich.progress 2. 训练结束后的可视化2.1. tensorboardX2.1.1. 安装2.1.2. 使用 1. 训练过程中的可视化 主要是监控训练的进度。 1.1. alive_progress 安装 pip install alive_progress使用 from alive_progress i…

提取B站视频

1、将视频链接粘贴到下面的网站&#xff0c;下载视频到本地。 贝贝BiliBili - B站视频下载 2、使用剪映打开视频&#xff0c;导入视频&#xff0c;导出字幕文件SRT 剪映专业版-全能易用的桌面端剪辑软件-轻而易剪 上演大幕 3、上传SRT文件&#xff0c;解析出来即可 it365 字…

【 Go语言操作MongoDB时候的bson类型】

Go语言操作MongoDB时候的bson类型 在 MongoDB 中&#xff0c;bson&#xff08;Binary JSON&#xff09;是一种二进制编码的文档格式&#xff0c;用于在 MongoDB 和应用程序之间交换数据。bson.D、bson.M、bson.E 和 bson.A 都是 bson 包中的类型&#xff0c;用于处理和操作 bs…

Redis key过期删除机制实现分析

文章目录 前言Redis key过期淘汰机制惰性删除机制定时扫描删除机制 前言 当我们创建Redis key时&#xff0c;可以通过expire命令指定key的过期时间(TTL)&#xff0c;当超过指定的TTL时间后&#xff0c;key将会失效。 那么当key失效后&#xff0c;Redis会立刻将其删除么&#…

wsl2 ubuntu下配置go执行make init 错误 /bin/bash line 1 go command not found

我原来的配置是将www设置在mnt/d/www/goland export GOPATH/mnt/d/www/goland export GOROOT/usr/local/go export PATH$PATH:$GOROOT/bin:$GOPATH/bin后面改为了下面这样&#xff0c;然后重新拉取了项目&#xff0c;就可以了。 export GOPATH/home/用户名/go export GOROOT/…

设置webstorm和idea符合Alibaba规范

只格式化自己更改的代码 ctrlShiftAltL 插件建议 Alibaba Java Coding Guidelines&#xff08;新版本的idea不支持&#xff0c;有其他同名的非官方版可代替&#xff09;&#xff0c;使用方法在此不赘述 1、设置webstorm 包含 设置两个空格缩进&#xff0c;去掉行尾分号&#…

uniapp定时器的应用

1、初始化定时器 data(){return{timer: null, //定时器} } 2、定时器的使用 定时器分两种&#xff0c;setInterval和setTimeout。 二者的区别&#xff1a; setInterval函数会无限执行下去&#xff0c;除非调用clearInterval函数来停止它。setTimeout函数只执行一次&#x…

HarmonyOS/OpenHarmony应用开发-Stage模型应用/组件级配置

在开发应用时&#xff0c;需要配置应用的一些标签&#xff0c;例如应用的包名、图标等标识特征的属性。本文描述了在开发应用需要配置的一些关键标签。图标和标签通常一起配置&#xff0c;可以分为应用图标、应用标签和入口图标、入口标签&#xff0c;分别对应app.json5配置文件…

Xcode15 Library ‘iconv.2.4.0‘ not found

Xcode 15运行老代码报错&#xff1a;Library iconv.2.4.0 not found 解决&#xff1a; TARGETS-->Bulid Phases --> Link Binary With Libraries 添加一个“Libiconv.tbd”, 同时把原来的 “libiconv.2.4.0.tbd”删除&#xff08;一定要删除&#xff0c;不然运行还是…

悲观锁、乐观锁、mybatis-plus实现乐观锁

悲观锁、乐观锁、mybatis-plus实现乐观锁 转载自&#xff1a;www.javaman.cn 1、悲观锁、乐观锁 乐观锁和悲观锁是两种用于处理并发操作的数据锁定策略。它们在处理多个事务尝试同时访问和修改同一数据时的方法有所不同。 悲观锁 (Pessimistic Locking)&#xff1a; 概念&…