Flask框架之异常处理、请求钩子、上下文的使用

news2024/9/22 6:01:38

Flask框架之异常处理、请求钩子、上下文的使用

  • 异常处理
    • 捕获指定异常状态码
    • 捕获指定异常类型
    • 抛出HTTP Exception
  • 请求钩子
    • 概述
    • 基本使用
  • 请求上下文
    • 概述
    • 应用上下文
      • current_app对象
      • g对象
    • 请求上下文
      • request对象
      • session对象

异常处理

捕获指定异常状态码

可以使用@app.errorhandler装饰器,定义一个异常处理函数,当程序抛出指定错误状态码的时候,就会调用该装饰器所装饰的方法

@app.route('/')
def index():
    abort(500)
    return 'Hello World'


@app.errorhandler(500)
def internal_server_error(e):
    print(e)
    return '服务器错误''

捕获指定异常类型

可以使用@app.errorhandler装饰器,定义一个异常处理函数,当程序抛出特定类型的异常的时候,就会调用该装饰器所装饰的方法

@app.route('/')
def index():
    1 / 0
    return 'Hello World'


@app.errorhandler(ZeroDivisionError)
def zero_division_error(e):
    print(e)
    return '除数不能为0'

抛出HTTP Exception

可以使用Flask自带的abort函数抛出一个给定状态代码的HTTP Exception或者指定响应错误消息

注意:抛出的状态码,只能抛出HTTP协议的错误状态码

@app.route('/')
def index():
    abort(404)
    return 'Hello World'


@app.route('/')
def index():
    abort(500,"Internal Server Error")
    return 'Hello World'

请求钩子

概述

在 Flask 中,可以使用请求钩子来在请求处理过程中注册函数,以执行一些操作。

通常客户端与服务器交互过程中,会存在一些准备工作或收尾工作需要处理,例如:

1.在请求开始时,与数据库建立连接

2.在请求过程中,进行日志记录

3.在请求结束时,与数据库断开连接

在实际应用开发中,请求钩子常被用于以下场景:

认证和授权:使用 before_request 钩子来检查用户是否已登录或具有所需的权限,并根据需要重定向或返回一个错误信息。

日志记录:使用 before_request 钩子来记录每个请求的时间、来源 IP 和调用服务等信息,以便后续分析和排错。

跨域资源共享 (CORS) 支持:使用 after_request 钩子来添加 CORS 响应头,从而允许跨域请求访问应用程序接口。

缓存管理:使用 after_request 钩子来缓存响应结果,以加快后续相同请求的响应时间并减少对后端系统的负载。

响应格式转换:使用 after_request 钩子来将响应结果转换为特定的数据格式,如 JSON 或 XML。

基本使用

总之,请求钩子提供了一种优雅而简单的方式来执行与请求相关的辅助操作,可以使代码更易于维护和扩展。

Flask支持四种请求钩子:

before_first_request

before_request

after_request

teardown_request
from flask import Flask

app = Flask(__name__)


# 第一次请求之前调用,可以在方法内部做一些初始化操作
@app.before_first_request
def before_first_request():
    print("before_first_request")


# 在每一次请求之前调用,此时已经有请求,可能在方法里做请求校验
# 如果请求校验不成功,可以直接在方法中进行响应,直接return之后就不会执行视图函数
@app.before_request
def before_request():
    print("before_request")
    # return "fail"


# 在每次请求后执行,前提是没有抛出错误
# 接受一个参数:视图函数作出的响应
# 可以对响应值在返回之前做统一修改处理
@app.after_request
def after_request(response):
    print("after_request")
    response.headers["Content-Type"] = "application/json"
    response.headers["Token"] = "Python"
    return response


# 请每一次请求之后都会调用,接受一个参数:服务器出现的错误信息
@app.teardown_request
def teardown_request(err):
    print("teardown_request")


@app.route('/')
def index():
    return 'index'


if __name__ == '__main__':
    app.run(debug=True)

第1次请求时的打印:

before_first_request
before_request
after_request
teardown_request

第2次请求时的打印:

before_request
after_request
teardown_request

请求上下文

概述

在 Flask 中,上下文分为两种类型:

1.应用程序上下文 (app_context):

:表示整个 Flask 应用程序的状态,在应用程序启动之后一直存在于进程内。它提供了一种方便的方法来访问应用程序配置、数据库连接、日志记录、模板引擎等全局状态,能够在不同请求之间共享数据。

2.请求上下文 (request_context):

表示每个请求处理过程中的状态,包括 HTTP 请求对象、HTTP 响应对象等。

这两种上下文都可以使用上下文管理器(with 语句)手动创建和释放,也可以通过 Flask 中提供的装饰器(例如 @app.route 和 @app.before_request)实现自动创建和释放。

在 Flask 应用程序中,可以通过以下方式访问上下文:

在Flask程序未运行的情况下,调试代码时需要使用current_app、g、request、session等对象时,需要通过with语句进行使用

from flask import Flask, g, request, current_app

app = Flask(__name__)

# 使用 app_context 上下文管理器
with app.app_context():
    # 可以访问 app.config 配置参数
    print(current_app.config)

# 使用 request_context 上下文管理器
with app.test_request_context('/'):
    # 可以访问 request 和 g 对象
    request.args['key'] = 'value'
    g.my_value = 22
from flask import Flask
app = Flask('')
app.my_variable  = 'my_variable'
from flask import current_app

with app.app_context():
    print(current_app.my_variable)

应用上下文

在 Flask 中,应用程序上下文(app_context)是一个全局对象,表示整个应用程序的状态,在应用程序启动后一直存在于进程内。它提供了一种方便的方法来访问应用程序配置、数据库连接、日志记录、模板引擎等全局状态,能够在不同请求之间共享数据。

current_app对象g 对象都是 Flask 提供的全局对象,用于在不同请求之间共享数据。它们的作用比较相似,但用途有所不同:

current_app对象

它是应用程序上下文中的一个全局对象,是当前请求应用程序实例的引用。它提供了访问Flask应用程序的全局状态和配置参数的方法。需要注意的是,只有在 Flask 应用处于处理请求的情况下才能使用current_app对象。否则,需要使用应用程序上下文来手动创建应用程序上下文。

g对象

它是请求上下文中的一个全局对象,它可以用于存储在多个请求之间共享的全局状态。g 通常是用来存储当前请求中的临时数据以便其他函数或中间件能够访问和修改。g 对象是线程安全的,在不同的请求间互不影响。

current_app对象

应用程序上下文,用于存储应用程序中的变量,可以通过current_app.name打印当前app的名称,也可以在current_app中存储一些变量

应用程序上下文可以使用 Flask.app_context() 上下文管理器手动创建,或者在 Flask 应用中自动创建。

from flask import Flask, current_app

app = Flask(__name__)

# 使用app_context() 上下文管理器创建了一个新的应用程序上下文,并在其中通过current_app.config获取了当前应用程序的调试配置值
with app.app_context():
    print(current_app.config["DEBUG"])

注意:current_app就是当前运行的flask app,在代码不方便直接操作flask的app对象时,操作current_app就等价于操作flask app对象

from flask import Flask, current_app

app1 = Flask(__name__)
app2 = Flask(__name__)

# 为每个应用创建一个变量,并在后续视图中使用
app1.my_variable = 'app1 my_variable'
app2.my_variable = 'app2 my_variable'


@app1.route('/')
def test1():
    return current_app.my_variable

@app2.route('/')
def test2():
    return current_app.my_variable

配置环境变量

1.pycharm
在这里插入图片描述
2.命令方式

export FLASK_APP=main:app1

flask run

g对象

g作为flask程序全局的一个临时变量,充当中间媒介的作用,可以通过它在一次请求调用的多个函数间传递一些数据。每次请求都会重设这个变量。

from flask import Flask, g

app = Flask(__name__)


def user():
    name = g.name
    age = g.age
    print('name={} age={}'.format(name, age))
    return {"name": name, "age": age}


@app.route('/')
def get_user():
    g.name = "Python"
    g.age = 20
    return user()

请求上下文

Flask 的请求上下文是一个存在于每个请求期间的变量容器。它提供了一种方便的方法来访问请求相关的信息和对象,例如请求头、URL 参数、表单数据、Session 对象等。

在flask中,请求上下文对象有:requestsession

1.request对象

它存储了关于客户端(如浏览器)发出的HTTP请求的信息,比如请求的URL、POST数据、HTTP头等。代码可以通过访问request对象来访问这些信息。

2.Session对象

它存储了与特定用户相关的信息,并将这些信息跨越多个页面请求进行持久化。一旦会话(session)在服务器端创建,会生成一个唯一标识符,也被称为“session ID”。每次向服务器发送请求时,客户端都会包含该ID,从而使得服务器能够识别当前请求属于哪个会话。 然后就可以通过访问session对象来读取或修改与特定用户相关的信息。

request对象

request 对象代表当前 HTTP 请求,包含了请求方法、URL、请求头、表单数据、查询参数等请求相关的信息,通过 Flask.request 全局变量可以访问到该对象。通常可以使用request.args来获取请求 URL 中的参数,使用 request.form 获取 POST 请求中提交的数据。

# 获取get请求的参数
user = request.args.get('user')

session对象

session对象它可以在不同请求之间存储和共享数据,并被浏览器端的cookie技术所支持。主要用来记录请求会话中的信息,针对用户信息

# 记录用户信息
session['name'] = user.name

# 获取用户信息
session.get('name')

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

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

相关文章

Github的使用

1.基本概念: 仓库(Repository):仓库用来存放项目代码,每个项目对应一个仓库,多个开源项目则有多个仓库 收藏(Star):收藏项目,方便下次查看 复制克隆项目:(Fork&#x…

JVM类加载、类变量初始化顺序

题目 先来看一个题目,以下程序的输出结果是什么 运行结果 关于类加载机制 关于JVM的类加载 《深入理解Java虚拟机》中关于类加载是这样说的: Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化&#x…

【SLAM学习】基于Pangolin绘制运动轨迹

Pangolin是一个轻量级的跨平台视图控制库,主要用于可视化、交互和调试三维数据。该库提供了一系列图形界面工具,包括窗口、OpenGL渲染器、3D相机、图像显示等,可以方便地进行三维数据可视化和交互。 Pangolin库的主要特点如下: 轻…

SpringBoot的多配置文件

文章目录 1.配置文件的命名规则2.配置文件选择3.配置文件的优先级 1.配置文件的命名规则 配置文件一般要求以application开头,可以是.yml结尾的文件,也可以是.properties结尾的文件。 2.配置文件选择 当有多个配置文件,需要指定其中一个生…

关于C语言取余运算的那些大坑

0.前言 您好,这里是limou3434的一篇个人博文,感兴趣的话您也可以看看我的其他文章,本次我想给您带来的是关于C语言操作符‘%’的一些奇怪现象以及背后的原理解释,本章用了一点点python语法(比如在python中“//”是整除…

C++开发环境的搭建-Windows:VSCode+mingw64+CMake

文章目录 一、软件安装1. 网址及下载的软件2. VSCode中配置关于C的最简插件: 二、C调试环境的编译要求1. 在编译时要带-g参数2. 多文件编译需要分步编译 三、VSCode的调试配置如下:1. 单文件调试设置4. 多文件调试设置 一、软件安装 1. 网址及下载的软件…

【JavaEE进阶】——第六节.第一个MyBatis程序

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:JavaEE进阶 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!! 文章目录 前…

计算机视觉(5)—— 图像分类

目录 五、图像分类 5.1 AlexNet 5.2 VGG 5.3 GoogLeNet、Inception 5.3.1 Inception V1 5.3.2 Inception V2 5.3.3 Inception V3 5.3.4 Inception V4 5.4 ResNet 残差网络 5.4.1 ResNet 5.4.2 ResNeXt 5.5 CNN设计准则 五、图像分类 5.1 AlexNet 5.2 VGG 5.3 Go…

【剑指 Offer】05,替换字符创中的空格;难度等级:简单。易错点:C++中 char 和 string 类型的转换

【剑指 Offer】05,替换字符创中的空格;难度等级:简单。 文章目录 一、题目二、题目背景三、我的解答四、易错点五、知识点:char 和 string 类型的转换 一、题目 二、题目背景 在网络编程中,如果 URL 参数中含有特殊字…

消息推送平台的实时数仓?!flink消费kafka消息入到hive

大家好,3y啊。好些天没更新了,并没有偷懒,只不过一直在安装环境,差点都想放弃了。 上一次比较大的更新是做了austin的预览地址,把企业微信的应用和机器人消息各种的消息类型和功能给完善了。上一篇文章也提到了&#…

windows安装Anaconda

Anacond是什么? 和Python有啥关系? 1、Anacond 是一个python的发行版,包括了python和很多常见的软件库, 和一个包管理器conda。常见的科学计算类的库都包含在里面了,使得安装比常规python安装要容易。 2、Anaconda是专注于数据分…

分布式系统概念和设计——时间和全局状态(分布式系统中的时间问题)

分布式系统概念和设计 时间和全局状态 全局物理时间的缺乏使我们很难查明分布式程序的执行时状态。 我们经常需要知道当进程B处在某种状态依赖进程是什么状态,但不能通过依靠物理时钟理解一个同一个时刻到底是什么情况。 维护分布数据一致性算法检查发送给服务器的…

数学(三) -- LC[1010][1015] 可被 K 整除的最小整数

1 可被 K 整除的最小整数 1.1 题目描述 题目链接:https://leetcode.cn/problems/smallest-integer-divisible-by-k/description/ 1.2 思路分析 模运算 如果让你计算 1234 ⋅ 6789 1234 \cdot 6789 1234⋅6789 的个位数,你会如何计算? 由于…

c高级day2

#include <stdio.h> #include <stdlib.h> #include <string.h>int arrMAX_1(void *p,int n,int m,int x,int y); int arrMAX_2(void *p,int n,int m,int x,int y); int main(int argc, const char *argv[]) {int n0,m0;printf("请输入行数i 列数j\n&quo…

Baumer工业相机堡盟工业相机如何进行多个工业相机IP地址配置

Baumer工业相机堡盟工业相机如何进行多个工业相机IP地址配置 Baumer工业相机Baumer工业相机进行多相机IP配置的技术背景Baumer工业相机如何进行多相机IP配置1.配置Baumer工业相机连接的PC端IP地址2.配置Baumer工业相机的IP地址 Baumer工业相机 Baumer工业相机堡盟相机是一种高…

R 中的探索性相关分析

动动发财的小手&#xff0c;点个赞吧&#xff01; 本文[1] 相关分析是探索两个或多个变量之间关系的最基本和最基础的方法之一。您可能已经在某个时候使用 R 执行过相关分析&#xff0c;它可能看起来像这样&#xff1a; cor_results <- cor.test(my_data$x, my_data$y, …

手机上调试pc端电脑上的项目

文章目录 前言1、window r 打开电脑命令窗口并输入cmd点击确定或者敲击回车键2、在cmd命令行面板上输入ipconfig获取本电脑的ip地址3、在手机浏览器中输入http://192.168.XX.XX:8080 即可 前言 手机上调试电脑运行的项目的前提条件是手机和电脑公用一个局域网&#xff08;也就…

APP 性能优化你掌握的怎么样?简单聊聊?

产品性能是每个技术团队比较关心的一件事&#xff0c;不管是产品上线前到上线后&#xff0c;都需要对产品进行性能监控和优化&#xff0c;如果产品在运行过程中出现了问题&#xff0c;是很影响用户的体验感受。 所以在一些大厂技术团队中&#xff0c;是非常看重个人性能优化的…

面向开发人员的 ChatGPT 提示词教程中文版

面向开发人员的 ChatGPT 提示词教程中文版 1. 指南1-1. 提示的指南1-2. 配置1-3. 提示语原则原则 1: 写出清晰而具体的指示技巧 1: 使用分隔符来清楚地表明输入的不同部分技巧 2: 要求提供结构化的输出技巧 3: 要求模型检查条件是否得到满足技巧 4: "少许样本"提示 原…

为你推荐一款最好用的免费截图工具-Snipaste,截图高清、智能模糊还支持滚动长截图!!!

写文章经常需要插入截图&#xff0c; 但是常常很难有顺手的截图工具&#xff0c; 常见的难题是&#xff1a; 很难滚动长屏截图&#xff0c; 截图中马赛克处理很麻烦&#xff0c; 输出的截图图像质量差。 经过大量的工具使用对比&#xff0c; 这里推荐一个最好用的截图工具。 Sn…