开源模型应用落地-FastAPI-助力模型交互-进阶篇-中间件(四)

一、前言

   FastAPI 的高级用法可以为开发人员带来许多好处。它能帮助实现更复杂的路由逻辑和参数处理,使应用程序能够处理各种不同的请求场景,提高应用程序的灵活性和可扩展性。

    在数据验证和转换方面,高级用法提供了更精细和准确的控制,确保输入数据的质量和安全性。它还能更高效地处理异步操作,提升应用程序的性能和响应速度,特别是在处理大量并发请求时优势明显。

    此外,高级用法还有助于更好地整合数据库操作、实现数据的持久化和查询优化,以及实现更严格的认证和授权机制,保护应用程序的敏感数据和功能。总之,掌握 FastAPI 的高级用法可以帮助开发人员构建出功能更强大、性能更卓越、安全可靠的 Web 应用程序。

    本篇学习FastAPI中高级中间件的相关内容,包括添加ASGI中间件、集成的中间件以及一些具体中间件的用法。


二、术语

2.1. middleware函数

    middleware函数(中间件)它在每个请求被特定的路径操作处理之前,以及在每个响应返回之前工作。可以用于实现多种通用功能,例如身份验证、日志记录、错误处理、请求处理、缓存等。其主要作用是在请求和响应的处理过程中添加额外的处理逻辑,而无需在每个具体的路由处理函数中重复编写这些逻辑。

    一般在碰到以下需求场景时,可以考虑使用中间件来实现:

  1. 身份验证:验证请求的身份,如检查 JWT token 或使用 OAuth2 进行验证;
  2. 日志记录:记录请求和响应的日志,包括请求方法、URL、响应状态码等信息;
  3. 错误处理:处理应用程序中的异常情况,捕获异常并返回自定义的错误响应;
  4. 请求处理:对请求进行处理,例如解析请求参数、验证请求数据等;
  5. 缓存:在中间件中检查缓存中是否存在请求的响应,如果存在则直接返回缓存的响应。

2.2.HTTPSRedirectMiddleware

    强制所有传入请求必须是https或wss,否则将会被重定向。

2.3.TrustedHostMiddleware

    强制所有传入的请求都正确设置的host请求头。

2.4.GZipMiddleware

    处理任何在请求头Accept-Encoding中包含“gzip”的请求为GZip响应。


三、前置条件

3.1. 创建虚拟环境&安装依赖

conda create -n fastapi_test python=3.10
conda activate fastapi_test
pip install fastapi uvicorn

四、技术实现

4.1. 自定义中间件

# -*- coding: utf-8 -*-
import uvicorn
from fastapi import FastAPI, Request, HTTPException
from starlette import statusapp = FastAPI()black_list = ['192.168.102.88']@app.middleware("http")
async def my_middleware(request: Request, call_next):client_host = request.client.hostprint(f"client_host: {client_host}")if client_host in black_list:raise HTTPException(status_code=status.HTTP_403_FORBIDDEN,detail="Prohibit access")else:response = await call_next(request)return response@app.get("/items/")
async def read_items():return [{"item_id": "Foo"}]if __name__ == '__main__':uvicorn.run(app, host='0.0.0.0',port=7777)

 调用结果:

正常访问,未命中黑名单:

非法访问,命中黑名单:

4.2. HTTPSRedirectMiddleware

  强制所有传入请求必须是https或wss。

# -*- coding: utf-8 -*-
import uvicornfrom fastapi import FastAPI
from fastapi.middleware.httpsredirect import HTTPSRedirectMiddlewareapp = FastAPI()app.add_middleware(HTTPSRedirectMiddleware)@app.get("/hello")
async def main():return {"message": "Hello World"}if __name__ == '__main__':uvicorn.run(app, host='0.0.0.0', port=7777)

调用结果:

http请求会重定向至https请求

4.3. TrustedHostMiddleware

强制所有传入的请求都正确设置的主机请求头。

# -*- coding: utf-8 -*-
import uvicornfrom fastapi import FastAPI
from fastapi.middleware.trustedhost import TrustedHostMiddlewareapp = FastAPI()app.add_middleware(TrustedHostMiddleware, allowed_hosts=["localhost"]
)@app.get("/hello")
async def main():return {"message": "Hello World"}if __name__ == '__main__':uvicorn.run(app, host='0.0.0.0', port=7777)

调用结果:

 使用代码指定的域名:localhost > 正常访问

 使用非代码指定的域名:127.0.0.1 > 禁止访问,提示:Invalid host header

4.4. GZipMiddleware

  处理 Accept-Encoding 标头中包含“gzip”的任何请求,小于minimum_size(默认值是500)将不会执行GZip响应。

# -*- coding: utf-8 -*-
import uvicorn
from fastapi import FastAPI
from starlette.middleware.gzip import GZipMiddlewareapp = FastAPI()app.add_middleware(GZipMiddleware, minimum_size=1)@app.get("/hello")
async def main():return {"message": "Hello World"}if __name__ == '__main__':uvicorn.run(app, host='0.0.0.0', port=7777)

将minimum_size设置成100


五、附带说明

5.1.如何使用 CORSMiddleware 处理 CORS

CORS (Cross-Origin Resource Sharing) - FastAPIFastAPI framework, high performance, easy to learn, fast to code, ready for productionicon-default.png?t=N7T8https://fastapi.tiangolo.com/tutorial/cors/

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

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

相关文章

【优秀设计案例】基于K-Means聚类算法的球员数据聚类分析设计与实现

背景及意义 随着NBA比赛的日益竞争激烈,球队需要更加深入地了解球员的能力和特征,以制定更有效的战术和球队管理策略。而NBA球员的统计数据包含了大量有价值的信息,通过对这些数据进行聚类分析,可以揭示出球员之间的相似性和差异…

套接字编程一(简单的UDP网络程序)

文章目录 一、 理解源IP地址和目的IP地址二、 认识端口号1. 理解 "端口号" 和 "进程ID"2. 理解源端口号和目的端口号 三、 认识协议1. 认识TCP协议2. 认识UDP协议 四、 网络字节序五、 socket编程接口1. socket 常见API2. sockaddr结构(1&#…

Leetcode1688. 比赛中的配对次数

问题描述: 给你一个整数 n ,表示比赛中的队伍数。比赛遵循一种独特的赛制: 如果当前队伍数是 偶数 ,那么每支队伍都会与另一支队伍配对。总共进行 n / 2 场比赛,且产生 n / 2 支队伍进入下一轮。如果当前队伍数为 奇…

如何获得Cesium的TileSet并设置本地服务器的Url

一.总体思路 首先使用管理者获得TileSet,通过JSON文件读写,调用对应的Cesium内部提供的函数。 UE5中Json文件的读取与解析 - 知乎 (zhihu.com) 不太了解JSON的可以学习这个。 二.具体实现 1.创建Actor,并且 如何获得Cesium的TileSet,设置本地Url 一…

PHP连接MySQL数据库

PHP本身不具备操作MySQL数据库的能力,需要借助MySQL扩展来实现。 1、PHP加载MySQL扩展:php.ini文件中。(不要用记事本打开) 2、PHP中所有扩展都是在ext的文件夹中,需要指定扩展所在路径:extension_dir。 3、…

Vue项目实现单点登录(SSO)的逻辑和基本流程

项目集群如果一个一个登录会非常麻烦,尤其是一些大企业或者多项目使用一套体系数据的环境中,这时候登录中心也就应用而生, 今天简单说一下vue sso的实现思路,vue项目实现单点登录(SSO)通常涉及以下几个步骤…

【数据结构】排序算法——Lessen1

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…

防御保护课-防火墙接口配置实验

一、实验拓扑 (我做实验用的图如下) 二、实验要求 1.防火墙向下使用子接口分别对应生产区和办公区 2.所有分区设备可以ping通网关 三、实验思路 配IP; 划分vlan并配置vlan; 配置路由和安全策略。 四、实验配置 1、画图并…

【引领未来智造新纪元:量化机器人的革命性应用】

在日新月异的科技浪潮中,量化机器人正以其超凡的智慧与精准的操作,悄然改变着各行各业的生产面貌,成为推动产业升级、提升竞争力的关键力量。今天,让我们一同探索量化机器人在不同领域的广泛应用价值,见证它如何以科技…

相对定位语法:css+xpath基础语法使用-定位页面元素

文章目录 CSS相对定位获取元素关系定位顺序关系 XPath相对定位基础语法顺序关系-通过索引获取元素选取元素 总结 ✨✨✨学习的道路很枯燥,希望我们能并肩走下来! 编程真是一件很奇妙的东西。你只是浅尝辄止,那么只会觉得枯燥乏味&#xff0c…

python基础语法 007 文件操作-2文件支持模式文件的内置函数

1.3 文件支持的模式 模式含义ropen a file for reading(default)wopen a file for writing,creates a new file if it does not exist or truncates the file if it exists x open a file foe exclusive creation. if the file already exists, the operation fails.独创模式&…

数据结构day4

一、思维导图 二、课后练习 头文件 #ifndef LINKLIST_H #define LINKLIST_H #include <myhead.h>//定义数据类型 typedef int datatype;//定义节点类型 typedef struct Node {union{int len; //头结点数据域datatype data; //普通节点数据域};struct Node *next; …

PyTorch 深度学习实践-处理多维特征的输入

视频指路 参考博客笔记 参考笔记二 通过多个线性模型来模拟非线性的空间变换&#xff0c;矩阵计算就是不同维度之间的空间转换 说明&#xff1a;1、乘的权重(w)都一样&#xff0c;加的偏置(b)也一样。b变成矩阵时使用广播机制。神经网络的参数w和b是网络需要学习的&#xff0c…

浏览器跨tab页面通信方式总结

需求&#xff1a; 浏览器不同 tab 标签页之间是独立的&#xff0c; 如果要通信必须通过特殊手段来实现跨标签页通信。 1.StorageEvent 事件 当一个标签页 localStorage 变化时&#xff08;sessionStorage 无效&#xff09;&#xff0c;同源下另一个或其他所有标签页使用 DO…

buuctf web 第五到八题

[ACTF2020 新生赛]Exec 这里属实有点没想到了&#xff0c;以为要弹shell&#xff0c;结果不用 127.0.0.1;ls /PING 127.0.0.1 (127.0.0.1): 56 data bytes bin dev etc flag home lib media mnt opt proc root run sbin srv sys tmp usr var127.0.0.1;tac /f*[GXYCTF2019]Pin…

React的usestate设置了值后马上打印获取不到最新值

我们在使用usestate有时候设置了值后&#xff0c;我们想要更新一些值&#xff0c;这时候&#xff0c;我们要想要马上获取这个值去做一些处理&#xff0c;发现获取不到&#xff0c;这是为什么呢&#xff1f; 效果如下&#xff1a; 1、原因如下 在React中,当你使用useState钩子…

设计模式11-原型模式

设计模式11-原型模式 写在前面对象创建模式典型模式原型模式动机结构代码推导应用特点要点总结 原型模式与工厂方法模式对比工厂方法模式原型模式什么时候用什么模式 写在前面 对象创建模式 通过对象创建模式绕开动态内存分配来避免创建过程中所导致的耦合过紧的问题。从而支…

谷粒商城实战笔记-40-前端基础-Vue-计算属性、监听器、过滤器

文章目录 一&#xff0c;计算属性1&#xff0c;用途2&#xff0c;用法2.1 定义View2.2 声明计算属性 3&#xff0c;注意事项 二&#xff0c;监听器1. 使用 watch 监听属性的变化 三&#xff0c;过滤器1&#xff0c;定义局部过滤器2&#xff0c;定义全局过滤器3&#xff0c;使用…

GraphPad prism处理cck-8获得ic50

C组为空白对照组&#xff0c;a组为dmso对照组&#xff0c;b组为细胞加药组&#xff0c;八个梯度的药物浓度 一、数据转化 首先&#xff0c;打开软件&#xff0c;选项中选择x的第一项&#xff0c;y的第二项&#xff0c;单一药物浓度设定了几个孔就选几 把自己的药物浓度直接复制…

C语言·函数(超详细系列·全面总结)

前言&#xff1a;Hello大家好&#x1f618;&#xff0c;我是心跳sy&#xff0c;为了更好地形成一个学习c语言的体系&#xff0c;最近将会更新关于c语言语法基础的知识&#xff0c;今天更新一下函数的知识点&#xff0c;我们一起来看看吧&#xff01; 目录 一、函数是什么 &a…