【python】flask请求钩子,主动抛出异常与异常捕获

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN新星创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,前后端开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,linux,shell脚本等实操经验,网站搭建,面试宝典等分享。

所属的专栏:flask框架零基础,进阶应用实战教学
景天的主页:景天科技苑

文章目录

  • 请求全局钩子[hook]
  • flask异常抛出和捕获异常
    • 主动抛出HTTP异常
    • 捕获异常
    • 案例分析

请求全局钩子[hook]

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

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

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

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

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

  • before_first_request:

    • 在处理第一个请求前执行[项目刚运行第一次被客户端请求时执行的钩子]
    • 在flask2.2.4 版本之后,不再有这个钩子,目前没找到更好的替代方案
  • before_request:

    • 在每一次请求前执行[项目运行后,每一次接收到客户端的request请求都会执行一次]
    • 如果在某修饰的函数中返回了一个响应,视图函数将不再被调用
  • after_request

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

    • 在每一次请求后执行
    • 接受一个参数:错误信息,如果有相关错误抛出,就可以拿到错误
    • 需要设置flask的配置DEBUG=False,teardown_request才会接受到异常对象。
    • flask3.0之后,flask=True也能接收到报错信息了

代码:

from flask import Flask, session# 应用实例对象
app = Flask(__name__)"""给app单独设置配置项"""
# 设置秘钥
app.config["SECRET_KEY"] = "my SECRET KEY"# @app.before_first_request
# def before_first_request():
#     """
#     这个钩子会在项目启动后第一次被用户访问时执行
#     可以编写一些初始化项目的代码,例如,数据库初始化,加载一些可以延后引入的全局配置
#     """
#     print("----before_first_request----")
#     print("系统初始化的时候,执行这个钩子方法")
#     print("会在接收到第一个客户端请求时,执行这里的代码")@app.before_request
def before_request():"""这个钩子会在每次客户端访问视图的时候执行# 可以在请求之前进行用户的身份识别,以及对于本次访问的用户权限等进行判断。.."""print("----before_request----")print("每一次接收到客户端请求时,执行这个钩子方法")print("一般可以用来判断权限,或者转换路由参数或者预处理客户端请求的数据")@app.after_request
def after_request(response):   #注意,这个需要有个参数,用来接收响应print("----after_request----")print("在处理请求以后,执行这个钩子方法")print("一般可以用于记录会员/管理员的操作历史,浏览历史,清理收尾的工作")response.headers["Content-Type"] = "application/json"response.headers["Company"] = "python.Edu..."# 必须返回response参数return response@app.teardown_request
def teardown_request(exc):print("----teardown_request----")print("在每一次请求以后,执行这个钩子方法")print("如果有异常错误,则会传递错误异常对象到当前方法的参数中")# 在项目关闭了DEBUG模式以后,则异常信息就会被传递到exc中,我们可以记录异常信息到日志文件中print(f"错误提示:{exc}")  # 异常提示@app.route("/")
def index():print("-----------视图函数执行了---------------")return "ok"if __name__ == '__main__':# 启动项目的web应用程序app.run(host="0.0.0.0", port=5000, debug=True)

浏览器访问,看到响应头被修改
在这里插入图片描述

看下终端打印
先执行before_request,再执行after_request,最后执行teardown_request
在这里插入图片描述

我们人为设置个错误,然后让teardown_request接收
当debug=True时,能接收到错误信息
在这里插入图片描述

但是页面会报错
在这里插入图片描述

当debug=False时,也能接收到错误信息
在这里插入图片描述

页面显示500
在这里插入图片描述

flask异常抛出和捕获异常

主动抛出HTTP异常

  • abort 方法
    • 抛出一个给定状态代码的 HTTPException 或者 指定响应,例如想要用一个页面未找到异常来终止请求,你可以调用 abort(404)
  • 参数:
    • code – HTTP的错误状态码

使用案例:

from flask import Flask,abort,request
app = Flask(import_name=__name__)# 配置类
class Config(object):DEBUG = True     # 开启调试模式# 加载配置
app.config.from_object(Config)@app.route("/")
def index():# try:#     1/0# except:#     abort(500)#当请求查询参数中不包含username时,就报错username = request.args.get("username")if username is None:abort(400)return "ok"if __name__ == '__main__':app.run()

我们先不带查询参数username访问,直接报400错误代码
在这里插入图片描述

但是:
abort,只能抛出 HTTP 协议的错误状态码,一般用于权限等页面上错误的展示提示.

abort 在有些前后端分离的项目里面不会被使用,往往在业务错误的时候使用raise进行抛出错误类型,而不是抛出http异常。

捕获异常

  • app.errorhandler 装饰器
    • 注册一个错误处理程序,当程序抛出指定错误状态码的时候,就会调用该装饰器所装饰的方法
  • 参数:
    • code_or_exception – HTTP的错误状态码或指定异常
  • 例如统一处理状态码为500的错误给用户友好的提示

案例:

from flask import Flask, request, abortapp = Flask(__name__)#自定义一个异常类
class NetWorkError(Exception):pass@app.route("/")
def index():password = request.args.get("password")if password != "123456":# 主动抛出HTTP异常!# abort的第一个参数:表示本次抛出的HTTP异常状态码,后续其他参数,表示错误相关的提示内容。# abort(400, "密码错误!")raise NetWorkError("网络请求出错!")# print(hello)return "ok"# @app.errorhandler的参数是异常类型或者HTTP状态码
@app.errorhandler(NameError)
def NameErrorFunc(exc):"""针对变量命名的异常处理:param exc::return:"""print(exc.__traceback__)return {"error": f"{exc}"}@app.errorhandler(400)
def error_400(exc, *args, **kwargs):print(exc.__traceback__)print(exc.code)        # 上面abort传递的错误状态码print(exc.description) # 上面abort传递的错误描述return {"error": f"{exc.description}"}@app.errorhandler(404)
def error_404(exc):print(exc.code)        # 上面abort传递的错误状态码print(exc.description) # 上面abort传递的错误描述return {"error": "当前页面不存在!"}@app.errorhandler(NetWorkError)
def network_error(exc):return {"error": f"{exc}"}if __name__ == '__main__':app.run(host="0.0.0.0", port=5000, debug=True)

案例分析

1.当我们请求中查询参数不包含password或者password的值不是123456时,我们abort(400, “密码错误”) 抛出密码错误,和400错误状态码
在这里插入图片描述

我们通过errorhandler来捕获这个错误状态码,然后返回我们自定义的页面
exc.description就是abort里面的第二个参数,错误描述

在这里插入图片描述

浏览器访问
在这里插入图片描述

2.当我们通过raise主动抛出一个我们自定义了错误类
在这里插入图片描述

此时,我们根据错误类型来捕获,并返回指定页面
在这里插入图片描述

浏览器访问
在这里插入图片描述

3.当我们打印一个不存在的变量,报NameError时
在这里插入图片描述

通过errorhandler捕获
在这里插入图片描述

浏览器访问,可以显示我们返回的页面内容
在这里插入图片描述

4.当我们访问一个不存在的url,我们捕获404报错,然后返回指定页面
在这里插入图片描述

浏览器访问
在这里插入图片描述

总结:
综上就是flask请求钩子的设置方式,以及在什么情况下用什么样的请求钩子,主动抛出异常的方式,对异常的捕获,返回更好看的异常显示页面等等,感兴趣的朋友可以一键三连,flask持续更新中!!!

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

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

相关文章

综合实验---Web---进阶版

目录 实验配置: 1.PHP调整主配置文件时,修改文件内容 1.原内容调整(在编译安装的情况下) 2.调整如下 3.没有调整的,根据之前配置就行 2.配置Nginx支持PHP解析 1.原内容如下 2.调整如下 3.验证PHP测试页 1.原内容如下 2.调整如下 4…

Vant4:自动导入样式无效问题

今天前端小伙伴使用了Vant4,发现了一个奇怪的问题:按照Vant官方文档,按需引入组件样式(Vite 的项目): 安装插件 # 通过 npm 安装 npm i vant/auto-import-resolver unplugin-vue-components unplugin-aut…

Linux——du, df命令查看磁盘空间使用情况

一、实现原理: df 命令的全称是Disk Free ,显而易见它是统计磁盘中空闲的空间,也即空闲的磁盘块数。它是通过文件系统磁盘块分配图进行计算出的。 du 命令的全称是 Disk Used ,统计磁盘有已经使用的空间。它是直接统计各文件各目…

金融知识分享系列之:支撑阻力

金融知识分享系列之:支撑阻力 一、支撑阻力原理二、支撑阻力作用1.识别市场资金的预期2.作为入场和平仓的重要参考 三、寻找支撑阻力四、延伸思考五、支撑阻力总结 一、支撑阻力原理 支撑阻力核心要素: 锚定效应订单驱动 支撑阻力原理: 市…

产品经理面试如何自我介绍?

金三银四求职季,你是不是也有面试的冲动!但面试并不是头脑一热就能取得好结果,在此之前,必须得有周全的准备,才能应对好面试官的“连环问”! 所以,今天这篇产品经理面试干货文章,别…

数据结构--链表刷题(一)快慢指针

1.快慢指针 先看一道简单的题目:返回中间结点 这道题有一个最朴素的做法就是先遍历一边链表,设置计数器求出链表长度,再重新走1/2的链表长度,即可返回中间节点 // 第二种解法 //这种解法需要遍历两次链表ListNode cur1 head;int…

Git基础(24):分支回退

前言 将分支回退到之前的某个版本 开发中,可能开发某个功能不需要了,或者想要回退到之前历史的某个commit, 放弃后来修改的内容。 放弃已修改的内容 如果未提交,直接使用 git revert分支回退到指定commit 操作前的分支网络图…

Git版本管理--远程仓库

前言: 本文记录学习使用 Git 版本管理工具的学习笔记,通过阅读参考链接中的博文和实际操作,快速的上手使用 Git 工具。 本文参考了引用链接博文里的内容。 引用: 重学Git-Git远程仓库管理_git remote add origin-CSDN博客 Git学习笔记&am…

【数据结构】选择排序

大家好,我是苏貝,本篇博客带大家了解选择排序,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 一. 基本思想二. 直接选择排序 一. 基本思想 每一次从待排序的数据元素中选出最小&#xff…

【GPT概念-03】:人工智能中的注意力机制

说明 注意力机制生成分数(通常使用输入函数),确定对每个数据部分的关注程度。这些分数用于创建输入的加权总和,该总和馈送到下一个网络层。这允许模型捕获数据中的上下文和关系,而传统的固定序列处理方法可能会遗漏这…

android adb 实时画面 和操作

1. 下载 scrcpy 建议 windows10 用户 点击链接下载 不然可能会提示缺少部分 dll https://github.com/Genymobile/scrcpy/releases/download/v2.3.1/scrcpy-win32-v2.3.1.ziphttps://github.com/Genymobile/scrcpy/releases/download/v2.3.1/scrcpy-win32-v2.3.1.zip windo…

LVGL:拓展部件——键盘 lv_keyboard

一、概述 此控件特点: 特殊Button矩阵:lv_keyboard 本质上是一个经过定制的按钮矩阵控件。每个按钮都可以独立触发事件或响应。预定义的键映射:lv_keyboard 自带了一套预设的按键布局和对应的字符映射表,开发者可以根据需要选择…

Vue2在一个页面内动态切换菜单显示对应的路由组件

项目的需求是在一个页面内动态获取导航菜单,导航菜单切换的时候显示对应的路由页面,类似于tab切换的形式,切换的导航菜单和页面左侧导航菜单是同一个路由组件,只是放到了一个页面上,显示的个数不同,所有是动…

JS加密解密之字符编码知识

在前端开发中,字符编码是一个至关重要的概念,特别是在数据传输、加密和解密等方面。JavaScript作为一种常用的脚本语言,在处理字符编码时也有其独特之处。本文将详细介绍JavaScript中的字符编码知识,包括字符编码的分类和相关案例…

kubernetes K8s的监控系统Prometheus安装使用(一)

简单介绍 Prometheus 是一款基于时序数据库的开源监控告警系统,非常适合Kubernetes集群的监控。Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态,任意组件只要提供对应的HTTP接口就可以接入监控。不需要任何SDK或者其他的集成过程。这样做…

JsonUtility.ToJson 和UnityWebRequest 踩过的坑记录

项目场景: 需求:我在做网络接口链接,使用的unity自带的 UnityWebRequest ,数据传输使用的json,json和自定义数据转化使用的也是unity自带的JsonUtility。使用过程中发现两个bug。 1.安全验证失败。 报错为&#xff1a…

JavaEE 初阶篇-深入了解进程与线程(常见的面试题:进程与线程的区别)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 进程概述 2.0 线程概述 2.1 多线程概述 3.0 常见的面试题:谈谈进程与线程的区别 4.0 Java 实现多线程的常见方法 4.1 实现多线程方法 - 继承 Thread 类…

Obsidian插件PicGo-图床创建使用[腾讯云保姆级教程]

一、下载PicGo并配置 1:安装插件 首先插件市场搜索picgo会出现Image auto upload,这个就是PicGo安装此插件并启用即可 2:安装PicGo软件 打开此链接:https://github.com/Molunerfinn/PicGo 自己选择一个方式下载,我…

CSS案例-5.margin产品模块练习

效果1 相关数据 整体长:298px,高:415px 效果2 知识点 外边距margin 块级盒子水平居中 条件: 必须有宽度左右外边距设为auto 三种写法: margin-left:auto;margin-right:auto&…

爬虫逆向sm3和sm4 加密 案例

注意!!!!某XX网站逆向实例仅作为学习案例,禁止其他个人以及团体做谋利用途!!! 案例--aHR0cDovLzExMS41Ni4xNDIuMTM6MTgwODgvc3Vic2lkeU9wZW4 第一步:分析页面和请求方式 …