开源模型应用落地-FastAPI-助力模型交互-进阶篇-RequestDataclasses(三)
一、前言
FastAPI 的高级用法可以为开发人员带来许多好处。它能帮助实现更复杂的路由逻辑和参数处理,使应用程序能够处理各种不同的请求场景,提高应用程序的灵活性和可扩展性。
在数据验证和转换方面,高级用法提供了更精细和准确的控制,确保输入数据的质量和安全性。它还能更高效地处理异步操作,提升应用程序的性能和响应速度,特别是在处理大量并发请求时优势明显。
此外,高级用法还有助于更好地整合数据库操作、实现数据的持久化和查询优化,以及实现更严格的认证和授权机制,保护应用程序的敏感数据和功能。总之,掌握 FastAPI 的高级用法可以帮助开发人员构建出功能更强大、性能更卓越、安全可靠的 Web 应用程序。
本篇学习如何在FastAPI中直接使用Request对象和如何使用数据类Dataclasses。
二、术语
2.1. Request对象
是用于处理 HTTP 请求的核心对象,它提供了许多功能和属性,以便更灵活地处理和访问客户端发送的请求信息。例如:获取客户端的IP地址/主机,可以通过访问Request
对象来实现。
2.2. middleware函数
middleware函数(中间件)它在每个请求被特定的路径操作处理之前,以及在每个响应返回之前工作。可以用于实现多种通用功能,例如身份验证、日志记录、错误处理、请求处理、缓存等。其主要作用是在请求和响应的处理过程中添加额外的处理逻辑,而无需在每个具体的路由处理函数中重复编写这些逻辑。
一般在碰到以下需求场景时,可以考虑使用中间件来实现:
- 身份验证:验证请求的身份,如检查 JWT token 或使用 OAuth2 进行验证;
- 日志记录:记录请求和响应的日志,包括请求方法、URL、响应状态码等信息;
- 错误处理:处理应用程序中的异常情况,捕获异常并返回自定义的错误响应;
- 请求处理:对请求进行处理,例如解析请求参数、验证请求数据等;
- 缓存:在中间件中检查缓存中是否存在请求的响应,如果存在则直接返回缓存的响应。
2.3. dataclasses
表示类和函数的一种轻量级数据定义方式。通过 @dataclass
装饰的数据类具有以下特点和优势:
- 自动生成方法:无需手动编写繁琐的
__init__
、__repr__
等方法,装饰器会自动添加这些方法。 - 默认值和类型提示:可以为属性设置默认值,并添加类型提示,提高代码的可读性和可维护性。
- 不可变实例:通过设置
frozen=True
,可以创建不可变的实例,增加代码的稳定性,防止对象被意外修改。 - 类型检查和验证:支持类型检查和验证,可使用
field
函数添加对属性的验证规则。 - 自动生成合理的
__repr__
和__eq__
方法:方便比较和输出对象。 - 继承和默认值工厂:支持继承和默认值工厂,使复杂的类层次结构定义更简单。
- 可转换为字典或元组:提供了
asdict
和astuple
函数,方便将数据类实例转换为字典或元组。
三、前置条件
3.1. 创建虚拟环境&安装依赖
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说明:
- 使用dataclasses,代码更加简洁、易读,并且不易出错
- 使用dataclasses,使得代码在不同的上下文中更易于使用和扩展
- 使用dataclasses,增强了代码的可读性和可维护性。
相关文章:
开源模型应用落地-FastAPI-助力模型交互-进阶篇-RequestDataclasses(三)
一、前言 FastAPI 的高级用法可以为开发人员带来许多好处。它能帮助实现更复杂的路由逻辑和参数处理,使应用程序能够处理各种不同的请求场景,提高应用程序的灵活性和可扩展性。 在数据验证和转换方面,高级用法提供了更精细和准确的控制&#…...
2024.7.20 暑期训练记录(6)
CF 1391D - 505(思维状压dp) 首先简化问题,发现一个矩阵如果要满足条件,那它其中的每一个 2 2 2\times 2 22 的小矩阵都要满足条件,于是很容易发现 4 4 4\times4 44 的矩阵是一定不满足条件的(因为是…...
firefly rk3288 ubuntu23.10 网卡名为end0 改为eth0
1、内核源码修改u-boot/include/env_default.h文件第32行的bootargs参数,修改后: "bootargs net.ifrenames0 " CONFIG_BOOTARGS "\0"2、修改rootfs里的lib/systemd/network/99-default.link文件: [M…...
git使用总结
概述 简介 Git是一种代码托管技术,很多代码托管平台也是基于Git来实现的。 Git可以帮我们做到很多的事情,比如代码的版本控制,分支管理等。 网址 git官网:https://git-scm.com/ 版本控制系统【VCS】 可以完整保存项目的快照&#…...
使用多进程和多线程实现服务器并发【C语言实现】
在TCP通信过程中,服务器端启动之后可以同时和多个客户端建立连接,并进行网络通信,但是在一个单进程的服务器的时候,提供的服务器代码却不能完成这样的需求,先简单的看一下之前的服务器代码的处理思路,再来分…...
深入理解Linux网络(三):TCP对象创建
深入理解Linux网络(三):TCP对象创建 TCP对象创建inet_createsock_init_data TCP对象创建 常见的三句TCP编程: int main() {int sk socket(AF_INET, SOCK_STREAM, 0);connect(sk, ...)recv(sk, ...) }简单的两三⾏代码ÿ…...
windows server——4.安装DNS管理器
windows server——4.安装DNS管理器 一、准备二、安装DNS管理器1.打开服务器管理器2.添加dns服务器 三、验证 一、准备 windows server电脑(已安装IIS) 静态网站数据包 二、安装DNS管理器 1.打开服务器管理器 2.添加dns服务器 点击管理——添加角色和…...
速盾:金融行业服务器如何避免DDoS攻击?
随着金融行业的数字化和网络化进程加快,服务器成为金融机构不可或缺的一部分。然而,服务器面临的安全威胁也在不断增加,其中之一就是DDoS攻击。DDoS(Distributed Denial of Service)攻击是通过向目标服务器发送大量无法…...
谷粒商城实战笔记-38-前端基础-Vue-指令-单向绑定双向绑定
文章目录 一,插值表达式注意事项1:不适合复杂的逻辑处理注意事项2:插值表达式支持文本拼接注意事项3:插值表达式只能在标签体中 二,v-html和v-textv-textv-html区别总结:最佳实践 三,v-model复选…...
MyPostMan 迭代文档管理、自动化接口闭环测试工具(自动化测试篇)
MyPostMan 是一款类似 PostMan 的接口请求软件,按照 项目(微服务)、目录来管理我们的接口,基于迭代来管理我们的接口文档,文档可以导出和通过 url 实时分享,按照迭代编写自动化测试用例,在不同环…...
https和http有哪些区别?
在今天的互联网世界中,我们经常听到关于HTTPS和HTTP的术语。它们都是超文本传输协议(HTTP)的变种,但它们之间存在着重要的区别。本篇博客将深入探讨HTTPS与HTTP之间的差异以及为什么HTTPS在现代网络中变得如此重要。 目录 1. HT…...
Bubbliiiing 的 Retinaface rknn python推理分析
Bubbliiiing 的 Retinaface rknn python推理分析 项目说明 使用的是Bubbliiiing的深度学习教程-Pytorch 搭建自己的Retinaface人脸检测平台的模型,下面是项目的Bubbliiiing视频讲解地址以及源码地址和博客地址; 作者的项目讲解视频:https:…...
Web前端-Web开发HTML基础8-nav
一. 基础 1. 写一个导航标签,里面是两个超链接,分别指向https://baidu.com和https://huawei.com/cn; 2. 写一个导航标签,里面是三个超链接,分别指向https://baidu.com、https://huawei.com/cn和https://www.nowcoder.c…...
如何建设和维护数据仓库:深入指南
欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: V: LAF20151116 进行更多交流学习 ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来ÿ…...
海思arm-hisiv400-linux-gcc 交叉编译rsyslog 记录心得
需要编译rsyslog,参考海思3536平台上rsyslog交叉编译、使用-CSDN博客和rsyslog移植(亲测成功)_rsyslog交叉编译-CSDN博客 首先下载了要用到的一些库的源码,先交叉编译这些库 原来是在centos6上交叉编译的,结果编译时报缺少软件要…...
IDEA工具中Java语言写小工具遇到的问题
一:读取excel时遇到 org/apache/poi/ss/usermodel/WorkbookProvider 解决办法: 在pom.xml中把poi的引文包放在最前面即可(目前就算放在最后面也不报错了,不知道为啥) 二:本地maven打包时,没有…...
2-38 基于matlab的蚁群算法优化无人机uav巡检
基于matlab的蚁群算法优化无人机uav巡检,巡检位置坐标可根据需求设置,从基地出发,返回基地,使得路径最小。可设置蚁群数量,信息素系数。输出最佳路线长度。程序已调通,可直接运行。 2-38 蚁群算法优化无人…...
解决selenium打印保存为PDF时图片未加载成功的问题
使用selenium打印网页时,如果程序运行很快的话,可能会导致图片没有加载成功即进行了保存,出现这个问题最初的思考是在执行打印任务时使用js进行强制等待,后发现实现效果并不好。在加载页面时使用自动下滑的方式将网页拉到底&#…...
如何将PDF转换成可以直接编辑的CAD图纸?
PDF图纸是为了让用户更好的阅览CAD文件,但是,当我们想要对其进行编辑的时候,PDF图纸就是一个麻烦了。那么PDF转换成CAD后可以编辑吗?如何将PDF转换成可以直接编辑的CAD图纸呢?本篇给你答案。 1、启动迅捷CAD编辑器&…...
【STM32】理解时钟树(图示分析)
文章目录 时钟系统什么是时钟时钟树简化图示类比示例时钟树详解时钟源系统时钟配置各总线时钟外设时钟 时钟系统 什么是时钟 时钟在电子和计算机系统中指的是生成周期性信号的电路或设备,这种周期性信号用于同步系统内的各种操作。时钟信号通常是方波,…...
动态内存四个函数
文章目录 1. malloc2. calloc3. realloc4. free 在C语言中,malloc、calloc、realloc 和 free 是用于动态内存管理的标准库函数,它们定义在 <stdlib.h> 头文件中。以下是这些函数的用法: 1. malloc malloc 函数用于在堆区分配指定大小…...
DevExpress WPF中文教程 - 为项目添加GridControl并将其绑定到数据
DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…...
高性能分布式IO系统BL205 OPC UA耦合器
边缘计算是指在网络的边缘位置进行数据处理和分析,而不是将所有数据都传送到云端或中心服务器,这样可以减少延迟、降低带宽需求、提高响应速度并增强数据安全性。 钡铼BL205耦合器就内置边缘计算功能,它不依赖上位机和云平台,就能…...
live555 rtsp服务器实战之doGetNextFrame
live555关于RTSP协议交互流程 live555的核心数据结构值之闭环双向链表 live555 rtsp服务器实战之createNewStreamSource live555 rtsp服务器实战之doGetNextFrame live555搭建实时播放rtsp服务器 注意:该篇文章可能有些绕,最好跟着文章追踪下源码&…...
Nginx系列-3 servername优先级和location优先级和常用正则表达式
1.正则表达式和分组 由于Nginx配置文件中经常出现正则表达式,因此本章节专门对常见的正则表达式进行简单介绍。 [1] 开始与结束 ^表示匹配输入字符串的开始 $表示匹配输入字符串的结束[2] 匹配次数 ?表示匹配0次或者1次 表示匹配1次或多次 *表示匹配0从或多次…...
python—爬虫爬取电影页面实例
下面是一个简单的爬虫实例,使用Python的requests库来发送HTTP请求,并使用lxml库来解析HTML页面内容。这个爬虫的目标是抓取一个电影网站,并提取每部电影的主义部分。 首先,确保你已经安装了requests和lxml库。如果没有安装&#x…...
实现图片拖拽和缩小放大功能。
1. 前言 不知道各位前端小伙伴蓝湖使用的多不多,反正我是经常在用,ui将原型图设计好后上传至蓝湖,前端开发人员就可以开始静态页面的的编写了。对于页面细节看的不是很清楚可以使用滚轮缩放后再拖拽查看,还是很方便的。于是就花了…...
昇思25天学习打卡营第18天|munger85
DCGAN生成漫画头像 首先肯定是下载训练数据,而这些训练数据就是一些卡通头像。后来我们会看到这个具体的头像 就像其他的数据集目录一样,它是由一些目录和这个目录下面的文件组成的数据集。 有相当多的图片。所以可以训练出来比较好的效果。 图片的处理…...
nginx配置文件说明
Nginx的配置文件说明 Nginx配置文件的主要配置块可以分为三个部分:全局配置块(events和http块),events块和http块。这三个部分共同定义了Nginx服务器的整体行为和处理HTTP请求的方式。 全局配置块: 包含了影响Nginx服…...
用不同的url头利用Python访问一个网站,把返回的东西保存为txt文件
这个需要调用requests模块(相当于c的头文件) import requests 还需要一个User-Agent头(这个意思就是告诉python用的什么系统和浏览器) Google Chrome(Windows): Mozilla/5.0 (Windows NT 10.0; Win64; x64…...
海南手机网站建设/天津seo渠道代理
本博文使用的数据库是MySQL和MongoDB数据库。安装MySQL可以参照我的这篇博文:https://www.cnblogs.com/tszr/p/12112777.html其中操作Mysql使用到的python模块是pymysql,下面是有关这个模块的使用说明:创建一个数据库testcreate DATABASE taobao;Navicat…...
辽宁高速公路建设管理局网站/网络营销图片
我是AY,杨洋,做wpf开发的,最近得了一种病,程序员患得患失综合征。同事说,我年纪在变大,技术跟不上。业余之间,我原创了写了一些语录,给大家中午休息,累疲惫的时候&#x…...
广州天河区做网站/广告主平台
前一段一直处于装修和新的项目上手的时期,没有闲下来总结反思。长长有一种猴子掰玉米的感觉。从今天开始简单总结一下之前的东西。 今天暂时列一个提纲出来,之后会逐个章节补充上来: 1.流媒体基本知识---- RTSP RTP RTCP 2.开源的编解码框架 …...
wordpress 判断用户组/兰州网络推广与营销
系统版本:ubuntu-16.04.3-desktop-amd64 Python3.5 注意unbuntu需要是64位的!!! tensorflow官方安装包目前不支持32位的os。 根据TensorFlow中文社区安装教程,首先进行如下操作: 首先, 安装所有必备工具…...
外贸自建站如何收款/网站优化要做哪些
保存照片和视频到系统相册显示- http://blog.csdn.net/chendong_/article/details/52290329 Android 7.0 之拍照与图片裁剪适配-http://blog.csdn.net/yyh352091626/article/details/54908624 拍照、相册及裁剪的终极实现(一)——拍照及裁剪功能实现- ht…...
汕头公司做网站/seo分析师
我试图在约束布局的运行时将TextViews添加到另一个之下。但我总是只有一个文本视图,其余的隐藏在它后面。我尝试了几件事情,包括链接视图,但似乎没有任何工作。Android ConstraintLayout:如何将动态视图添加到另一个下方private v…...