开源模型应用落地-FastAPI-助力模型交互-进阶篇(三)

一、前言

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

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

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

    本篇学习如何在FastAPI中直接使用Request对象和如何使用数据类Dataclasses。


二、术语

2.1. Request对象

    是用于处理 HTTP 请求的核心对象,它提供了许多功能和属性,以便更灵活地处理和访问客户端发送的请求信息。例如:获取客户端的IP地址/主机,可以通过访问Request对象来实现。

2.2. middleware函数

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

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

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

2.3. dataclasses

    表示类和函数的一种轻量级数据定义方式。通过 @dataclass 装饰的数据类具有以下特点和优势:

  1. 自动生成方法:无需手动编写繁琐的 __init____repr__ 等方法,装饰器会自动添加这些方法。
  2. 默认值和类型提示:可以为属性设置默认值,并添加类型提示,提高代码的可读性和可维护性。
  3. 不可变实例:通过设置 frozen=True,可以创建不可变的实例,增加代码的稳定性,防止对象被意外修改。
  4. 类型检查和验证:支持类型检查和验证,可使用 field 函数添加对属性的验证规则。
  5. 自动生成合理的 __repr__ 和 __eq__ 方法:方便比较和输出对象。
  6. 继承和默认值工厂:支持继承和默认值工厂,使复杂的类层次结构定义更简单。
  7. 可转换为字典或元组:提供了 asdict 和 astuple 函数,方便将数据类实例转换为字典或元组。

三、前置条件

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

  增加Google Search以及langchainhub的依赖

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

四、技术实现

4.1. 使用Request对象实现黑名单访问拦截

# -*- 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. 使用dataclasses

# -*- coding: utf-8 -*-
import uvicorn
from fastapi import FastAPI
from dataclasses import dataclass
from typing import Unionapp = FastAPI()@dataclass
class Item:name: strprice: floatdescription: Union[str, None] = Nonetax: Union[float, None] = None@app.post("/items/")
async def read_items(item: Item):print(f'item: {item}')return itemif __name__ == '__main__':uvicorn.run(app, host='0.0.0.0',port=7777)

调用结果:

使用pycharm的Http Request功能进行测试

选择POST Text Body,自动创建请求模版

修改IP和端口,填写请求参数

执行并观察结果


五、附带说明

5.1.不使用dataclasses的示例

# -*- coding: utf-8 -*-
import uvicorn
from fastapi import FastAPI
from typing import Unionapp = FastAPI()@app.post("/items1")
async def read_items(name: str,price: float,description: Union[str, None],tax: Union[float, None] ):item = Item(name= name,price=price,description=description,tax=tax)return itemif __name__ == '__main__':uvicorn.run(app, host='0.0.0.0',port=7777)

调用结果:

使用pycharm的Http Request功能进行测试

使用dataclasses vs 不使用dataclasses说明:

  1. 使用dataclasses,代码更加简洁、易读,并且不易出错
  2. 使用dataclasses,使得代码在不同的上下文中更易于使用和扩展
  3. 使用dataclasses,增强了代码的可读性和可维护性。

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

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

相关文章

Go网络编程-RPC程序设计

gRPC 通信 RPC 介绍 RPC, Remote Procedure Call,远程过程调用。与 HTTP 一致,也是应用层协议。该协议的目标是实现:调用远程过程(方法、函数)就如调用本地方法一致。 如图所示: 说明: Servi…

windows下安装启动运行MinIO

MinIO服务器本身是采用Go语言开发的; 编程操作MinIO服务器的客户端有很多: Go,Python,Java,.NET,JavaScript,Haskell,C 官方文档:https://min.io/docs/minio/linux/dev…

MySQL下载安装使用教程图文教程(超详细)

「作者简介」:冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础著作 《网络安全自学教程》,适合基础薄弱的同学系统化的学习网络安全,用最短的时间掌握最核心的技术。 这一章节我们使…

Jenkins-zookeeper-docker-xxljob-rancher

文章目录 Jenkins实战1 新建任务需要的配置pipeline Zookeeper基础 Docker基础实操windows11 docker mysql DockerhouseDockerhubxxl-Job基础实战 Rancher基础思考 实战1 Rancher的某个namespace的scale为0 Jenkins 实战 1 新建任务需要的配置pipeline 该代码是Jenkinsfile&…

版本控制工具

版本控制工具是用于记录代码文件变化历史、方便查阅特定版本修改情况的系统,一般分为集中式和分布式两种。以下是一些常见的版本控制工具: 集中式版本控制工具 Subversion(SVN) 简介:Subversion是一种集中式版本控制…

《基于 CDC、Spark Streaming、Kafka 实现患者指标采集》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

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

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

关于Flutter的build

框架是什么? 就是你按照约定去写 具体什么时候调用什么,他说了算 你只能按照它的规则去编写你的业务代码,然后就一切正常,你要是不遵循他的方法,就出错 就像你在 viewDidLoad 中直接把资源销毁,然后这个…

实现了一个心理测试的小程序,微信小程序学习使用问题总结

1. 如何在跳转页面中传递参数 ,在 onLoad 方法中通过 options 接收 2. radio 如何获取选中的值? bindchange 方法 参数e, e.detail.value 。 如果想要获取其他属性,使用data-xx 指定,然后 e.target.dataset.xx 获取。 3. 不刷…

全国媒体邀约,主流媒体到场出席采访报道

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 全国媒体邀约,确保主流媒体到场出席采访报道,可以带来一系列的好处,这些好处不仅能够增强活动的可见度,还能对品牌或组织的长期形象产生积…

【19】读感 - 架构整洁之道(一)

概述 《架构整洁之道》一书中有提到设计和架构的感念,它们究竟是什么?书是这么说的,它们的层次不一样,架构更“高层级”的说法,这类讨论一般都把“底层”的实现细节排除在外。而设计往往指代的具体的系统底层组织结构…

遍历Pandas DataFrame数据的行:方法与实践

遍历Pandas DataFrame数据的行:方法与实践 在数据分析和处理过程中,我们经常需要遍历Pandas DataFrame中的每一行数据。Pandas提供了多种方法来满足这一需求。本文将介绍几种常见的遍历DataFrame行的方法,并讨论它们的使用场景和注意事项。 …

将iPad 作为Windows电脑副屏的几种方法(二)

将iPad 作为Windows电脑副屏的几种方法(二) 1. 前言2. EV 扩展屏2.1 概述2.2 下载、安装、连接教程2.3 遇到的问题和解决方法2.3.1 平板连接不上电脑 3. Twomon SE3.1 概述3.2 下载安装教程 4. 多屏中心(GlideX)4.1 概述4.2 下载安…

基于FPGA的多路选择器

目录 一、组合逻辑 二、多路选择器简介: 三、实战演练 摘要:本实验设计并实现了一个简单的多路选择器,文章后附工程代码 一、组合逻辑 组合逻辑是VerilogHDL设计中的一个重要组成部分。从电路本质上讲,组合逻辑电路的特点是输…

数据结构(单链表算法题)

1.删除链表中等于给定值 val 的所有节点。 OJ链接 typedef struct ListNode ListNode;struct ListNode {int val;struct ListNode* next; };struct ListNode* removeElements(struct ListNode* head, int val) {//创建新链表ListNode* newhead, *newtail;newhead newtail N…

Vue3 之 computed 属性,实现日历翻月份功能

1. Vue3中的computed函数 1.1. 什么是computed? computed属性是Vue3中的一个响应式计算属性,它可以根据其他响应式数据的变化而自动更新其自身的值。computed属性可以接收一个计算函数,并在计算函数中使用其他响应式数据的值进行计算。当任何…

verilog bug记录——正点原子spi_drive存在的问题

verilog bug记录——正点原子spi_drive存在的问题 问题概述代码修改—spi_drive.v遗留问题 问题概述 因为项目需求,需要利用spi对flash进行擦除和写入操作,所使用的开发板是正电原子的达芬奇开发板,我事先往Flash里面存了两个bit&#xff0c…

全国产服务器主板:搭载飞腾FT2000+/64处理器的高性能加固服务器

近期很多朋友咨询全国产化的服务器主板。搭载的是飞腾FT-2000/64的全国产化服务器主板。他的主要特点是:①丰富的PCIe、千兆以太网、SATA接口,可用作数据处理、存储、通信服务器;②​​​​​​​板载独立显示芯片,对外HDMI/VGA/L…

UseMemo、UseCallback、React.memo

前置问题:React中的函数式组件什么时候会重新渲染?   答:组件中的状态改变(包含Context)、父组件重新渲染导致子组件的重新渲染。 组件多次重新渲染会导致性能的下降。UseMemo、UseCallback、React.memo都利用缓存机…

DP(6) | 完全背包 | Java | LeetCode 322, 179, 139 做题总结

322. 零钱兑换 我的错误答案 class Solution {public int coinChange(int[] coins, int amount) {int[][]dp new int [coins.length][amount1];for(int j0; j<amount; j) {if(coins[0] j){dp[0][coins[0]] 1;}}for(int i1; i<coins.length; i) {for(int j0; j<am…