[flask]请求全局钩子

flask从入门到精通之钩子、异常、context、jinjia模板、过滤器 - 异步非阻塞 - 博客园 (cnblogs.com)

参考的这个博客,但有一个需要注意的是,最新版本的flask不知道是不是更新了还是怎么了,他的before_first_request不见了,如果继续使用会出现AttributeError: 'Flask' object has no attribute 'before_first_request'. Did you mean: '_got_first_request'?  但........换成这个,又会出现TypeError: 'bool' object is not callable

我不理解哇,got_first_request又好像不存在?因为现在的flask资料找了很久,但没提到这个,所以如果是最新版本的flask可能,,需要再去找找文档,看一下app.py,但我没找到,我是菜鸡

有关于_got_first_request的信息只有两个,,,如果有人看到了,可以在评论区告诉我吗QWQ


正文

此处的全局钩子,其实就是类似django里面的中间件。 也就是只要调用或者注册了,在http请求响应中是必然执行的。

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

  • 在项目运行开始时,建立数据库连接,或创建连接池;
  • 在客户端请求开始时,根据需求进行身份识别,权限校验;
  • 在请求结束视图返回数据时,指定转换数据的格式,或者记录操作日志;

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

请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子(注意:钩子的装饰器名字是固定):

  • before_first_request  //新版本不知道叫什么,老版本应该还是这个
    • 在处理第一个请求前执行[项目刚运行第一次被客户端请求时执行的钩子]
  • before_request
    • 在每一次请求前执行[项目运行后,每一次接收到客户端的request请求都会执行一次]
    • 如果在某修饰的函数中返回了一个响应,视图函数将不再被调用
  • after_request
    • 如果没有抛出错误,在每次请求后执行视图结束以后,都会执行一次
    • 接受一个参数:视图函数作出的响应
    • 在此函数中可以对响应值在返回之前做最后一步修改处理
    • 需要将参数中的响应在此参数中进行返回
  • teardown_request:
    • 在每一次请求后执行
    • 接受一个参数:错误信息,如果有相关错误抛出
    • 需要设置flask的配置DEBUG=False,teardown_request才会接受到异常对象。
from flask import Flaskapp = Flask(__name__)# @app.before_first_request
def before_first_request():"""当项目启动以后,首次被客户端访问时自动执行被 @app.before_first_request 所装饰的函数用于项目初始化可以编写一些初始化项目的代码,例如,数据库初始化,加载一些可以延后引入的全局配置:return:"""print("before_first_request执行了!!!!")#app.before_first_request_funcs.append(before_first_request)@app.before_request
def before_request():"""每次客户端访问,视图执行之前,都会自动执行被 @app.before_request 所装饰的函数用于每次视图访问之前的公共逻辑代码的运行[身份认证,权限判断]:return:"""print("before_request执行了!!!!")@app.after_request
def after_request(response):"""每次客户端访问,视图执行之后,都会自动执行被 @app.after_request 所装饰的函数用于每次视图访问之后的公共逻辑代码的运行[返回结果的加工,格式转换,日志记录]:param response: 本次视图执行的响应对象:return:"""print("after_request执行了!!!!!")response.headers["Content-Type"] = "application/json"response.headers["Company"] = "python.Edu..."return response@app.teardown_request
def teardown_request(exc):"""每次客户端访问,视图执行报错以后,会自动执行 @app.teardown_request 所装饰的函数注意:在flask2.2之前,只有在DEBUG=False时,才会自动执行 @app.teardown_request 所装饰的函数:param exc: 本次出现的异常实例对象:return:"""print("teardown_request执行了!!!!!")print(f"错误提示:{exc}")  # 异常提示@app.route("/")
def index():print("----------------视图执行了!!!!--------------")return "ok"if __name__ == '__main__':app.run(host="0.0.0.0", port=5000, debug=True)

在这里可以看到他们的运行顺序,如果是第一次打开的话,最前面应该还会有before_first_request的相关信息

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

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

相关文章

Vue2源码 —— 数据响应式实现

Vue2源码 —— 数据响应式实现 配置项 //package.json {"name": "vue","version": "1.0.0","main": "index.js","scripts": {"dev": "rollup -cw"},"author": "&…

Linux非root用户安装mysql5.7

1、下载安装包MySQL :: Download MySQL Community Server 点击Archives 我下载的是5.7.27版本,linux主机直接选择linux-Generic即可,选择第一个包下载即可 2、安装mysql 解压 shell> tar xzvf mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz shell&g…

VUE2实现元素抖动的指令

指令代码 要实现Vue2的指令,可以按照以下步骤进行: 创建一个指令对象。 export default {inserted: (el, binding) > {// 触发抖动效果if (!binding.value) return el.classList.remove(shake-animation)el.classList.add(shake-animation)const a…

抽象类和接口的简单认识

目录 一、抽象类 1.什么是抽象类 2.抽象类的注意事项 3.抽象类与普通类的对比 二、接口 1.接口的简单使用 2.接口的特性 3.接口的使用案例 4.接口和抽象类的异同 一、抽象类 所谓抽象类,就是更加抽象的类,也就是说,这个类不能具体描…

等级保护测评无补偿因素的高风险安全问题判例(共23项需整改)

层面 控制点 要求项 安全问题 适用范围 充分条件 整改建议简要 安全物理环境 基础设施位置 应保证云计算基础设施位于中国境内 1.云计算基础设施物理位置不当 二级及以上 相关基础设施不在中国境内 云平台相关基础设施在中国境内部署 安全通信网络 网络架构 应…

NFC RC522开发记录

文章目录 一、ID卡、IC卡(M1卡、CPU卡)的区别二、RC522读写操作1. 数据读写流程三、RC522驱动代码1. RC522 与 STM32 的接线图2. RC522.c3. RC522.h4. main.c一、ID卡、IC卡(M1卡、CPU卡)的区别 ID卡 :只存储了ID号,设备识别ID号,没有算法可言,容易复制,安全性低IC卡包含了…

ALPHA开发板上PHY网络芯片LAN8720:常用的几个寄存器功能

一. 简介 正点原子的开发板 ALPHA开发板,有线网络硬件方案所使用的也是最常用的一种方案,IMX6ULL芯片内部是自带 MAC网络芯片的,所以,也就是采用 "SOC内部集成网络MAC外设 PHY网络芯片方案"。 前面一篇文章简单了解了…

Asp.net Core 中一键注入接口

Asp.net Core 中一键注入接口 前言准备开始使用 前言 在之前开发Asp.Net Core程序时遇到接口需要一个一个的注入到Services中,当有非常多的接口需要注入时会显得代码成为了一座山,这里记录一下如何通过接口的命名一键自动注入. 准备 IDE: Visual studio 2022 .Net版本:.Net …

机器学习——最优化模型

最优化模型的概述: 从某种程度上说,我们的世界是由最优化问题组成的。每一天,我们的生活都面临无数的最优化问题:上班怎么选择乘车路线,才能舒服又快速地到达公司;旅游如何选择航班和宾馆,既省…

不可变集合及Stream流

若希望某个数据是不可修改的,就可以考虑使用不可变集合,以提高安全性;(JKD9之后才有) List不可变集合: public static void main(String[] args) {/*创建不可变的List集合"张三", "李四&q…

conda 创建 python3.10.12 环境

conda 创建 python3.10.12 环境 介绍使用前置条件:安装 conda配置环境变量验证 Conda 安装结果创建环境:python激活 Anaconda 环境 验证 Python 版本。 介绍 Conda是一个开源的包管理和环境管理系统,由Continuum Analytics公司开发。它可以安…

python之@overload

from typing import overloadoverload def repeat(s: str, count: int) -> str:...overload def repeat(s: bytes, count: int) -> bytes:...这段代码是在定义一个名为repeat的函数,其中使用了Python的类型注解和装饰器overload来进行重载(Overloa…

批量爬取招聘网站【Boss直聘】上工作岗位的招聘信息

不管是学生还是工作的小伙伴,估计都对不同岗位工作几年的薪酬水平比较感兴趣。本文提供爬取招聘网站,获取某类工作招聘信息的实现逻辑和代码。具体的实施步骤是:明确爬取的招聘网站—确定爬取的工作城市—确定爬取的岗位—获取岗位的招聘子链…

学习Python渗透第14天:用python实现sql注入

sql注入这个漏洞一直位于owasp列出的漏洞排行榜的前几位,虽然这个漏洞的使用难度很低,但是破坏力却极其的大。sql注入的原理是将原本的sql语句与用户可控的参数进行了拼接,形成了非预期的sql语句的执行,从而可能造成信息泄露或者如…

Sy6 编辑器vi的应用(+shell脚本3例子)

实验环境: 宿主机为win11,网络:10.255.50.5 6389 WSL2 ubuntu 目标机的OS:Ubuntu 内核、版本如下: linuxpeggy0223:/$ uname -r 5.15.146.1-microsoft-standard-WSL2 linuxpeggy0223:/$ cat /proc/version Linux vers…

【Blockchain】区块 | 节点 | 共识机制 | 公链 | 联盟链 | 以太坊 | DApp | 智能合约

Blockchain 初识区块链区块链是什么什么是区块什么是节点什么是分布式什么是共识机制工作量证明(Proof of Work, PoW)权益证明(Proof of Stake, PoS)历史证明(Proof of History, PoH)权威证明(Proof of Authority, PoA)信誉共识(Proof of Reputation, PoR)存储证明(Proof of St…

【3DsMax+Pt】练习案例

目录 一、在3DsMax中展UV 二、在Substance 3D Painter中绘制贴图 一、在3DsMax中展UV 1. 首先创建如下模型 2. 选中如下三条边线作为接缝 重置剥 发现如下部分还没有展开 再选一条边作为接缝 再次拨开 拨开后的UV如下 二、在Substance 3D Painter中绘制贴图 1. 新建项目&am…

C++AVL树拓展之红黑树原理及源码模拟

前言:我们之前已经从零开始掌握AVL树http://t.csdnimg.cn/LaVCChttp://t.csdnimg.cn/LaVCC 现在我们将继续学习红黑树的原理并且实现插入等功能,学习本章的前提要求是掌握排序二叉树和AVL树,本章不再提及一些基础知识,防止本文结…

国产数据库中统计信息自动更新机制

数据库中统计信息描述的数据库中表和索引的大小数以及数据分布状况,统计信息的准确性对优化器选择执行计划时具有重要的参考意义。本文简要整理了下传统数据库和国产数据库中统计信息的自动更新机制,以加深了解。 1、数据库统计信息介绍 优化器是数据库…

纯小白蓝桥杯备赛笔记--DAY5(竞赛常用库函数)

文章目录 大小写转换islower和isupper:检查一个字符是否是小写或者大写。Tolower和toupper函数:ASCII码: 二分查找二分查找的前提:库函数只能对数组进行二分查找,且数组中的元素是单调的。binary_search函数&#xff1…