[flask]请求全局钩子

news2024/11/27 18:30:57

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 Flask


app = 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.coloradmin.cn/o/1560743.html

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

相关文章

17.应用负载压力测试

早些点,下午题考,最近几年出现的少; 备考较为简单;历年真题相似度高; 主要议题: 1.负载压力测试概述 注意这些测试细微的差别; 负载测试和压力测试的方法比较相似,但是目的不同&a…

科研学习|论文解读——情感对感知偶然信息遭遇的影响研究(JASIST,2022)

原文题目 Investigating the impact of emotions on perceiving serendipitous information encountering 一、引言 serendipity一词最初是由霍勒斯沃波尔创造的,他将其定义为“通过意外和睿智发现你并不追求的事物”。信息研究中大多数现有的偶然性定义从几个角度看…

LeetCode 第391场周赛个人题解

目录 哈沙德数 原题链接 思路分析 AC代码 换水问题 II 原题链接 思路分析 AC代码 交替子数组计数 原题链接 思路分析 AC代码 最小化曼哈顿距离 原题链接 思路分析 AC代码 哈沙德数 原题链接 思路分析 签到题,不说了 AC代码 class Solution:def s…

3月31号总结

java学习 一.面向对象之多态 什么是多态: 多态是在继承/实现情况下的一种现象。表现为对象多态、行为多态。 对象多态:一个对象可以有多种身份,比如一个人,可以是一个父亲,一个老师,或者等等。 行为多…

“‘悦’向新生,与‘榕’同行” 悦榕集团海外酒店中国区巡演圆满收官

三十周年盛会如约而至,来自25家海外酒店及地产代表亮相上海、深圳、成都3城 【中国上海,2024年3月29日】值此悦榕集团成立30周年之际,悦榕集团海外酒店中国区路演活动于上海、成都、深圳三地举行,旗下25家海外酒店和集团海外地产代…

Ch2 Posix IPC

2.1 概述 三种IPC均使用路径名进行标识。路径名既可以是系统中的实际路径名,也可不是,两者的不一致性可能带来移植性问题。 2.2 IPC名字 2.3 创建与打开IPC通道 2.4 IPC权限

milvus knowhere源码编译测试

简介 Knowhere 是 Milvus 的核心向量执行引擎,集成了Faiss、Hnswlib和Annoy等多个向量相似度搜索库。 编译环境 操作系统: Ubuntu 22.04.4 gcc/g:11.4.0 cmake: 3.27.7 安装依赖 apt install build-essential libopenblas-dev libaio-dev python3-dev python…

备考ICA----Istio实验12---配置双向TLS Istio Ingress Gateway实验

备考ICA----Istio实验12—配置双向TLS Istio Ingress Gateway实验 本实验部分配置延续上个Istio实验11 1. 重新配置secret 重新配置secret使其带有ca证书可以验证客户端证书是否合法 先删除原有secret,再配置新的secret # 删除原tls类型的secret kubectl -n istio-system d…

第四十六周:文献阅读+itransfomer

目录 摘要 Abstract 文献阅读:ITtransformer——转置transformer对时间序列预测的实用性 现有问题 提出方法 方法论 研究实验 实验目的 数据集 基线模型 实验结果 研究贡献 模型代码 总结 摘要 本周阅读的文献《Inverted Transformers are Effective…

海康威视【管理员】账号密码泄露【附Poc】

「企业介绍」 海康威视成立于2001年, 是一家专注技术创新的科技公司 ,在安防、智能物联领域耕耘二十余年,业务覆盖全球150多个国家和地区。公司致力于将物联感知、人工智能、大数据技术服务于千行百业,引领智能物联新未来&#x…

【Python】——变量名的命名规则

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL&#xff1a…

2024长三角快递物流高质量创新发展论坛

2024长三角快递物流高质量创新发展论坛暨 2024长三角快递物流供应链与技术装备展览会(杭州) 2024年7月8-10日 | 杭州国际博览中心 指导单位:浙江省邮政管理局 中国快递协会 主办单位:浙江省快递行业协会 联合主办:上…

【医学嵌入模型】中文医疗文本处理大模型 PCL-MedBERT

中文医疗文本处理大模型 PCL-MedBERT 提出背景对ELECTRA限制的深入分析eHealth的创新方法实体识别关系抽取 总结 最近再做医学项目,需要从文本中抽取医学概念和关系,通用模型的抽取效果还可以。 但还想找医学嵌入模型,能够更准确地从文本中识…

python---基础(一)

文章目录 前言1.对象的基本组成2.变量和常量2.1.变量的声明2.2.常量_链式赋值_系列解包赋值2.2.1.常量是不是真的常量?2.2.2.链式赋值2.2.3.系列解包赋值 3.内置数据类型_基本算数运算符3.1四种内置数据类型3.2.基本运算符3.3.divmod() 前言 这几年,随着…

Wasm初上手

总之也是为了扩宽技术面吧。。。我也不知道为什么就想试试了,就酱。 参考阅读:极客时间《WebAssembly入门课》 安装wasm的编译器Emscripten。Emscripten 是一个“源到源”语言编译器工具集,这个工具集可以将 C/C 代码编译成对应 JavaScript 代…

JavaScript 入门指南(三)BOM 对象和 DOM 对象

BOM 对象 BOM 简介 BOM(browser Object Model)即浏览器对象模型BOM 由一系列对象组成,是访问、控制、修改浏览器的属性的方法BOM 没有统一的标准(每种客户端都可以自定标准)。BOM 的顶层是 window 对象 window 对象 …

微机原理-基于8086电压报警器仿真系统设计

**单片机设计介绍,微机原理-基于8086电压报警器仿真系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于8086电压报警器仿真系统设计是一个综合了硬件和软件设计的复杂过程。以下是该设计概要的主要内容&…

TypeScript-自动编译

1.生成文件 tsc --init 2.修改配置文件 说明:通过CTRLF搜索到以下单词,进行修改。 "strict": true, //是否开启严格模式 "outDir": "./outFile", //表示ts文件最终编译为js文件,js文件存放的位置 3.新…

QML通过鼠标拖动的位置

当通过鼠标拖动Rectangle 的位置时,可以使用Qt Quick的MouseArea组件来实现 Rectangle {id: rectx:0;y:0width: 200; height: 100color: "lightblue"MouseArea {id: mouseAreaanchors.fill: parentdrag.target: rect//要拖动的项目的IDdrag.axis: Drag.XA…

C# 实践【WebService编写调用】

Webservice 学习 创建发布调用 创建 新增专案 点击确定,选择空白 右击新建好的专案下图中操作 新增项目选择 WEB 服务(ASMX) 新增项目完成,添加Web方法 启动之后的效果如下 调用方法测试接口 测试结果如下&#xff…