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,一经查实,立即删除!

相关文章

【云安全】云上攻击路径

一、2022年CSA发布的《云计算的11类顶级威胁》: 1)身份、凭据、访问和管理密钥、特权账号管理的不足 2)不安全的接口和API 3)配置不当和变更控制的不足 4)缺乏云安全架构和战略 5)不安全的软件开发 6…

通过 Docker 部署 MySQL 服务器

今天,我在三丰云的免费服务器上进行 MySQL 服务器的部署测试。三丰云的免费云服务器配置简洁,1核CPU、1G内存、10G硬盘和5M带宽,虽然是入门级别,但性能相当不错,确实是个不错的免费服务器。作为一个新手开发者或爱好者…

CSS-媒体查询

媒体查询使用 media 规则来定义,并包含一个或多个媒体特性和一个或多个样式规则。基本语法如下: media media-type and (media-feature) {/* 样式规则 */ } 其中: media-type 表示媒体类型,常见的媒体类型包括 all(…

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

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

Java:List<String> 转换List<BigDecimal> 并求和

/*** <b>Function: </b> todo** program: List<String> 转换List<BigDecimal> 并求和* Package: com.kingbal.king.dmp* author: dingcho* date: 2024/09/20* version: 1.0* Copyright: 2024 www.kingbal.com Inc. All rights reserved.*/ Slf4j publi…

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 < …

使用 uni-app 开发微信小程序的详细指南

使用 uni-app 开发微信小程序的详细指南 前言 随着微信小程序的广泛应用&#xff0c;越来越多的开发者开始关注小程序开发。而 uni-app 是 DCloud 推出的一个使用 Vue.js 开发跨平台应用的框架&#xff0c;不仅支持开发 H5、iOS 和 Android 应用&#xff0c;还可以用于开发微…

微博舆情分析技术文档分享

项目整体介绍&#xff1a;舆情瞭望——基于NLP的网络空间舆情检测分析系统 1. 项目背景与目标 该项目旨在对微博文章及其评论进行文本分析&#xff0c;重点包括情感分析和词频统计。通过对大量用户评论的处理与分析&#xff0c;帮助用户了解公众情绪和话题趋势&#xff0c;特…

基于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;-> 渲…

算法【双向广搜】

双向广搜常见用途 1&#xff1a;小优化。bfs的剪枝策略&#xff0c;分两侧展开分支&#xff0c;哪侧数量少就从哪侧展开。 2&#xff1a;用于解决特征很明显的一类问题。特征&#xff1a;全量样本不允许递归完全展开&#xff0c;但是半量样本可以完全展开。过程&#xff1a;把…

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

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

使用sqoop报错

报错一&#xff1a; java.io.IOException: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf 这个错误表示在执行与 Hive 相关的操作时&#xff0c;程序无法找 org.apache.hadoop.hive.conf.HiveConf 这个类。这个类是 Hive 的配置类&#xff0c;它用…

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时写过…