Flask 第十三课 -- 中间件和扩展

目录

一. 前言

二. Flask 中间件

2.1. 请求钩子

2.2. 自定义中间件

三. Flask 扩展

3.1. 常见的 Flask 扩展

3.2. 安装和使用 Flask 扩展

3.3. 创建自定义扩展


一. 前言

在 Flask 中,中间件和扩展是增强和扩展应用功能的两个关键机制。

通过中间件和扩展,你可以大大增强 Flask 应用的功能和灵活性,使得应用能够满足各种复杂的需求。

下面详细介绍这两者的概念和如何使用它们。

Flask 中间件

  • 使用请求钩子在请求处理的不同阶段插入代码。
  • 创建自定义中间件类来处理请求和响应。

Flask 扩展

  • 使用现有的扩展(如 Flask-SQLAlchemy、Flask-WTF)来添加功能。
  • 创建自定义扩展来满足特定需求。

二. Flask 中间件

Flask 的中间件(middleware)是对请求和响应进行处理的钩子,通常用于在请求到达视图函数之前或在响应发送到客户端之前执行一些操作。中间件可以用于日志记录、请求修改、响应修改等。

2.1. 请求钩子

请求钩子允许你在处理请求的不同阶段插入代码,Flask 提供了几种钩子来处理请求生命周期的不同阶段:

  • before_request:在每个请求处理之前执行。
  • after_request:在每个请求处理之后执行。
  • teardown_request:请求处理结束后,无论是否发生异常都会执行。
  • before_first_request:仅在应用第一次处理请求之前执行。

app.py 文件代码:

from flask import Flask, requestapp = Flask(__name__)@app.before_request
def before_request():print('Before request')@app.after_request
def after_request(response):print('After request')return response@app.teardown_request
def teardown_request(exception):print('Teardown request')@app.route('/')
def index():return 'Hello, World!'if __name__ == '__main__':app.run(debug=True)
  • @app.before_request:在每个请求处理之前打印 "Before request"。
  • @app.after_request:在每个请求处理之后打印 "After request"。
  • @app.teardown_request:在每个请求处理后(无论是否发生异常)打印 "Teardown request"。

2.2. 自定义中间件

Flask 还允许你创建自定义中间件类,这些中间件类可以在请求和响应处理的各个阶段进行操作。

middleware.py 文件代码:

class CustomMiddleware:def __init__(self, app):self.app = appdef __call__(self, environ, start_response):def custom_start_response(status, headers):headers.append(('X-Custom-Header', 'Value'))return start_response(status, headers)return self.app(environ, custom_start_response)

app.py 文件代码:

from flask import Flask
from middleware import CustomMiddlewareapp = Flask(__name__)app.wsgi_app = CustomMiddleware(app.wsgi_app)@app.route('/')
def index():return 'Hello, World!'if __name__ == '__main__':app.run(debug=True)

CustomMiddleware:自定义中间件类,添加一个自定义响应头。

三. Flask 扩展

Flask 扩展是用于为 Flask 应用添加功能的插件。Flask 的扩展可以集成第三方库,提供例如数据库集成、表单处理、用户认证等功能。

3.1. 常见的 Flask 扩展

  • Flask-SQLAlchemy:集成 SQLAlchemy ORM,使数据库操作更方便。
  • Flask-WTF:集成 WTForms 表单库,简化表单处理。
  • Flask-Login:提供用户会话管理和用户认证功能。
  • Flask-Migrate:用于数据库迁移的扩展,基于 Alembic。
  • Flask-Mail:用于发送电子邮件。

3.2. 安装和使用 Flask 扩展

以 Flask-SQLAlchemy 为例,安装:

pip install flask-sqlalchemy

配置和使用,app.py 文件代码:

from flask import Flask
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db'
db = SQLAlchemy(app)class User(db.Model):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(80), unique=True, nullable=False)@app.route('/')
def index():return 'Hello, World!'if __name__ == '__main__':app.run(debug=True)

SQLAlchemy 扩展集成了 SQLAlchemy,使得你可以轻松地定义模型并与数据库交互。

3.3. 创建自定义扩展

如果现有的扩展不能满足你的需求,你可以创建自己的扩展。创建自定义扩展通常涉及到定义一个类,提供初始化配置和相关功能。

myextension.py 文件代码;

class MyExtension:def __init__(self, app=None):if app is not None:self.init_app(app)def init_app(self, app):app.config.setdefault('MY_EXTENSION_CONFIG', 'default_value')app.after_request(self.after_request)def after_request(self, response):response.headers['X-My-Extension'] = 'MyValue'return response

app.py 文件代码:

from flask import Flask
from myextension import MyExtensionapp = Flask(__name__)
my_ext = MyExtension(app)@app.route('/')
def index():return 'Hello, World!'if __name__ == '__main__':app.run(debug=True)

MyExtension:自定义扩展,添加了一个自定义响应头。

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

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

相关文章

使用LangGPT提示词让大模型比较浮点数

使用LangGPT提示词让大模型比较浮点数 背景介绍环境准备创建虚拟环境安装一些必要的库安装其他依赖部署大模型启动图形交互服务设置提示词与测试 LangGPT结构化提示词 背景介绍 LLM在对比浮点数字时表现不佳,经验证,internlm2-chat-1.8b (internlm2-cha…

HObject复制耗时试用

测试源码一 //第一步const int N 1000;HObject[] imgs new HObject[N];for (int i 0; i < N; i){HOperatorSet.GenImageConst(out imgs[i], "byte", 1024 i, 1024 i);}//第二步List<HObject> lists new List<HObject>();for(int i 0; i < …

基于PHP的新闻管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于phpMySQL的新闻管理系统。…

MySQL的缓存策略

目录 一、MySQL 缓存方案用来干什么 二、提升MySQL访问性能的方式 1、读写分离&#xff08;MySQL的主从复制&#xff09; 2、连接池 3、异步连接 三、缓存方案是怎么解决的 1、缓存与MySQL一致性状态分析 2、制定热点数据的读写策略 四、缓存方案问题的解决方法 1、缓…

酸枣病虫害智能化防控系统的探索与实践,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建枣类作物种植场景下酸枣病虫害智能检测识别系统

智慧农业&#xff0c;作为现代农业的高级形态&#xff0c;通过集成物联网、大数据、人工智能等先进技术&#xff0c;实现了农业生产过程的精准化、智能化管理。在酸枣等经济作物的种植过程中&#xff0c;病虫害的及时监测与防控直接关系到作物的产量与质量&#xff0c;进而影响…

react hooks--React.memo

基本语法 React.memo 高阶组件的使用场景说明&#xff1a; React 组件更新机制&#xff1a;只要父组件状态更新&#xff0c;子组件就会无条件的一起更新。 子组件 props 变化时更新过程&#xff1a;组件代码执行 -> JSX Diff&#xff08;配合虚拟 DOM&#xff09;-> 渲…

Knife4j 一款基于Swagger的开源文档管理工具

一、简单介绍 1.1 简介 Knife4j 是一款基于Swagger的开源文档管理工具&#xff0c;主要用于生成和管理 API 文档 二、使用步骤&#xff1a; 2.1 添加依赖&#xff1a; <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spr…

spark之不同序列化对比

一&#xff0c;spark的rdd的序列话不同介绍 下面是使用不同序列化后的占用资源和数据大小 2&#xff0c;sparksql中序列化的区别 sparksql中使用序列化和不使用差别不大&#xff0c;英文sparksql中默认使用了encode自己实现的序列化方法&#xff0c;加上与不加序列化差别不大…

编译成功!QT/6.7.2/Creator编译Windows64 MySQL驱动(MSVC版)

相邻你找了很多博文&#xff0c;都没有办法。现在终于找到了正宗。 参考 GitHub - thecodemonkey86/qt_mysql_driver: Typical symptom: QMYSQL driver not loaded. Solution: get pre-built Qt SQL driver plug-in required to establish a connection to MySQL / MariaDB u…

.whl文件下载及pip安装

以安装torch_sparse库为例 一、找到自己需要的版本&#xff0c;点击下载。 去GitHub的pyg-team主页中找到pytorch-geometric包。网址如下&#xff1a; pyg-team/pytorch_geometric​github.com/pyg-team/pytorch_geometric 然后点击如图中Additional Libraries位置的here&am…

Leetcode Hot 100刷题记录 -Day18(反转链表)

反转链表&#xff1a; 问题描述&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&a…

基于阿里云免费部署Qwen1-8B-chat模型并进行lora参数微调从0到1上手操作

文章目录 一、申请资源二、创建实例三、克隆微调数据四、部署Qwen1-8B-chat模型1、环境配置2、模型下载3、本地模型部署 五、模型微调1、拉取Qwen仓库源码2、微调配置3、合并微调参数4、本地部署微调模型 一、申请资源 阿里云账号申请PAI资源详细教程我已于部署ChatGLM3时写过…

双立方(三次)卷积插值

前言 图像处理中有三种常用的插值算法&#xff1a; 最邻近插值 双线性插值 双立方&#xff08;三次卷积&#xff09;插值 其中效果最好的是双立方&#xff08;三次卷积&#xff09;插值&#xff0c;本文介绍它的原理以及使用 如果想先看效果和源码&#xff0c;可以拉到最底…

关于若尔当矩阵中过渡矩阵的求法

关于若尔当矩阵中过渡矩阵的求法 豆瓜爱数学 ​关注 桜井雪子 等 114 人赞同了该文章 本文主要介绍考研中常考的另一类问题&#xff0c;当我们确认一个Jordan标准形时&#xff0c;对于过渡矩阵如何确定&#xff1f;这个常常是我们复习过程中容易忽略的一部分内容&#xff0c;…

物联网——USART协议

接口 串口通信 硬件电路 电平标准 串口参数、时序 USART USART主要框图 TXE: 判断发送寄存器是否为空 RXNE: 判断接收寄存器是否非空 RTS为输出信号&#xff0c;用于表示MCU串口是否准备好接收数据&#xff0c;若输出信号为低电平&#xff0c;则说明MCU串口可以接收数据&#…

简单题69.x的平方根 (Java)20240919

问题描述&#xff1a; java代码&#xff1a; class Solution {public int mySqrt(int x) {if (x < 2) {return x; // 0 和 1 的平方根分别是它们自己}int left 2; // 从2开始&#xff0c;因为0和1已经处理了int right x / 2; // 最大可能的平方根不会超过 x / 2int mid;w…

列表、数组排序总结:Collections.sort()、list.sort()、list.stream().sorted()、Arrays.sort()

列表类型 一.Collections.sort() Collections.sort()用于List类型的排序&#xff0c;其提供了两个重载方法&#xff1a; 1.sort(List<T> list) &#xff08;1&#xff09;List指定泛型时只能指定引用数据类型&#xff0c;也就是说无法用于基本数据类型的排序。 &am…

Matlab R2024B软件安装教程

一、新版本特点 MATLAB R2024B版本带来了众多新特性和改进&#xff0c;旨在提升用户的内容创作体验和工程效率。以下是该版本的一些主要特点&#xff1a; 1. 性能提升和优化&#xff1a;R2024B版本在性能上进行了显著优化&#xff0c;无论是在提问、回答问题、发布新技巧还是…

el-table 的单元格 + 图表 + 排序

<el-table border :data"tableDataThree" height"370px" style"width: 100%"><el-table-column :key"activeName 8" width"50" type"index" label"序号" align"center"></el…

JS实现树形结构数据中特定节点及其子节点显示属性设置的技巧(可用于树形节点过滤筛选)

大家好&#xff0c;今天我要分享的是如何在树形结构的数据中&#xff0c;根据特定条件设置节点及其所有子节点的显示属性。在实际项目中&#xff0c;这种需求非常常见&#xff0c;特别是在需要动态展示和隐藏节点的情况下。下面我将通过一个具体的示例来讲解实现过程。 需求分析…