高效开发 Python Web 应用:FastAPI 数据验证与响应体设计
高效开发 Python Web 应用:FastAPI 数据验证与响应体设计
目录
- 🧑💻 FastAPI 的数据验证系统与 Pydantic 模型
- 📦 响应体与模型:定义响应数据的最佳实践
- 🔄 响应模型与查询参数的结合:增强灵活性与可维护性
1. 🧑💻 FastAPI 的数据验证系统与 Pydantic 模型
FastAPI 是基于 Python 的一个现代化、快速的 Web 框架,它提供了丰富的功能和强大的数据验证机制,使得开发者能够在构建 RESTful API 时减少大量的繁琐工作。而其强大的数据验证功能主要依赖于 Pydantic 模型。Pydantic 不仅能进行数据校验,还能够生成接口文档和自动化验证,从而显著提升开发效率和应用的可靠性。
数据验证与 Pydantic 模型
Pydantic 是 FastAPI 的核心数据验证工具,它基于 Python 3.6+ 的类型注解系统进行数据验证。FastAPI 在处理请求体时,能够自动地将请求数据映射到 Pydantic 模型,并对其进行验证。Pydantic 不仅能够验证常见的基础数据类型(如字符串、数字等),还支持复杂类型的验证(如嵌套模型、日期等)。这种类型安全的方式减少了许多常见错误,尤其是在处理外部数据时,能够有效避免数据不一致或格式错误的问题。
from pydantic import BaseModel
from datetime import datetime# 定义 Pydantic 模型
class Item(BaseModel):name: str # 商品名称,类型为字符串description: str = None # 商品描述,默认为空price: float # 商品价格,类型为浮动小数tax: float = 0.0 # 税收,默认为0.0created_at: datetime # 商品创建时间,类型为日期时间# 创建 FastAPI 应用
from fastapi import FastAPIapp = FastAPI()@app.post("/items/")
async def create_item(item: Item):return {"item": item}
Pydantic 模型的优势
- 类型安全:Pydantic 使用 Python 的类型注解来定义模型,使得数据验证变得直观且易于理解。即使数据类型不匹配,FastAPI 会自动抛出相应的错误信息。
- 嵌套验证:通过嵌套模型,可以进行更复杂的数据结构验证。例如,如果模型中的一个字段本身是另一个 Pydantic 模型,Pydantic 会自动验证内部数据的正确性。
- 自动文档生成:基于 Pydantic 模型,FastAPI 会自动生成文档,帮助开发者快速了解接口的使用方式和数据要求。文档也可以实时反映数据类型和验证规则。
- 动态校验:Pydantic 支持自定义验证逻辑,可以通过内置的验证器对数据进行更细粒度的校验。
代码示例解析
上述代码示例中,首先定义了一个 Item 类,它继承自 Pydantic 的 BaseModel 类。该模型包含了商品的名称、描述、价格、税收和创建时间等字段。在 FastAPI 中,我们定义了一个 POST 请求接口 /items/,用于接收客户端提交的商品信息。FastAPI 会自动将请求体数据转换为 Item 模型,并对其进行类型验证。如果传入的数据不符合模型定义的类型,FastAPI 会自动返回 422 错误,并在响应体中展示具体的错误信息。
总结
通过使用 Pydantic 模型,FastAPI 极大地简化了数据验证的过程。开发者只需定义模型,FastAPI 会自动完成数据的校验、解析和转换。这种自动化处理减少了开发人员的工作量,同时也提升了应用的安全性和可靠性。
2. 📦 响应体与模型:定义响应数据的最佳实践
FastAPI 使得定义响应体变得非常简单且直观。响应体不仅仅是将数据返回给客户端,它还需要满足数据的格式和结构要求。在 FastAPI 中,可以通过 Pydantic 模型来定义响应体数据,从而确保接口返回的数据符合预期的格式,并且能够进行自动化验证。
使用 Pydantic 模型定义响应体
通常情况下,响应体是 API 返回给客户端的数据。在 FastAPI 中,响应体可以通过指定 response_model 参数来实现模型定义。response_model 允许开发者指定一个 Pydantic 模型,该模型会自动映射到返回的数据中。
from fastapi import FastAPI
from pydantic import BaseModel# 定义响应数据模型
class ItemResponse(BaseModel):name: strprice: floattax: floattotal: float# 创建 FastAPI 应用
app = FastAPI()# 模拟计算价格并返回响应数据
@app.get("/items/{item_id}", response_model=ItemResponse)
async def get_item(item_id: int):item_data = {"name": "Item A", "price": 100.0, "tax": 10.0}item_data["total"] = item_data["price"] + item_data["tax"]return item_data
响应体模型的作用
- 自动映射与格式化:通过
response_model参数,FastAPI 会自动将函数返回的数据映射到 Pydantic 模型,并根据模型定义进行格式化。任何不符合模型结构的数据都会被丢弃或转换,从而确保返回的数据符合预期格式。 - 清晰的接口定义:响应体的模型不仅能确保返回数据的一致性,还能提供清晰的接口文档,帮助前端开发人员准确了解 API 的返回结构。
- 自动数据校验:FastAPI 会根据 Pydantic 模型自动进行响应数据的校验。如果返回的数据不符合模型定义,FastAPI 会在响应中返回错误信息。
响应体模型的实际应用
在实际开发中,定义响应体模型是非常常见的需求,尤其是在涉及到复杂的数据结构时。例如,某些 API 可能需要返回一个列表或嵌套的结构,这时就可以通过嵌套模型来定义响应数据的格式。
from typing import Listclass OrderItem(BaseModel):name: strquantity: intprice: floatclass OrderResponse(BaseModel):order_id: intitems: List[OrderItem]total_price: float@app.get("/orders/{order_id}", response_model=OrderResponse)
async def get_order(order_id: int):order_data = {"order_id": order_id,"items": [{"name": "Item A", "quantity": 2, "price": 50.0}],"total_price": 100.0}return order_data
总结
使用 Pydantic 模型定义响应体是一种非常高效的方式,它不仅能够保证返回数据的一致性和准确性,还能够自动生成 API 文档,帮助开发者更好地管理和测试接口。通过这种方式,可以提高应用的可维护性,并减少错误的发生。
3. 🔄 响应模型与查询参数的结合:增强灵活性与可维护性
FastAPI 支持非常灵活的查询参数和响应模型的结合,开发者可以根据具体的业务需求,将查询参数和响应模型结合在一起,从而实现更加灵活的接口设计。查询参数通常用于客户端请求中,来指定需要获取的资源或执行的操作。响应模型则用于描述 API 返回的数据格式。
查询参数与响应模型的结合
FastAPI 允许开发者将查询参数与响应模型结合使用。例如,开发者可以根据查询参数的值来控制返回的数据结构,或者根据参数的不同值来调整响应数据的内容。
from fastapi import FastAPI, Query
from typing import Optional
from pydantic import BaseModelclass ItemResponse(BaseModel):name: strprice: floattax: floattotal: floatapp = FastAPI()@app.get("/items/", response_model=ItemResponse)
async def get_item(item_id: int,include_tax: Optional[bool] = Query(True, alias="include-tax")
):item_data = {"name": "Item A", "price": 100.0}if include_tax:item_data["tax"] = 10.0item_data["total"] = item_data["price"] + item_data["tax"]else:item_data["tax"] = 0.0item_data["total"] = item_data["price"]return item_data
查询参数的灵活性与可配置性
FastAPI 的查询参数非常灵活,开发者可以使用 Query 类为查询参数添加详细的配置,包括参数默认值、类型、校验规则等。通过 Optional 类型和默认值的结合,FastAPI 能够根据查询参数的变化灵活地调整
返回数据。
from typing import List, Optional@app.get("/items/filter/", response_model=List[ItemResponse])
async def filter_items(name: Optional[str] = None,price_min: Optional[float] = None,price_max: Optional[float] = None
):items = [{"name": "Item A", "price": 100.0, "tax": 10.0},{"name": "Item B", "price": 200.0, "tax": 20.0}]filtered_items = []for item in items:if name and name.lower() not in item["name"].lower():continueif price_min and item["price"] < price_min:continueif price_max and item["price"] > price_max:continuefiltered_items.append(item)return filtered_items
响应模型的动态构建
通过灵活的查询参数,开发者可以动态地调整返回数据的内容。例如,在上面的代码中,通过 include_tax 参数,控制是否包含税收信息。类似地,filter_items 接口通过 name、price_min 和 price_max 查询参数来过滤返回的商品列表。这种方式不仅增强了 API 的灵活性,还能有效减小前端和后端之间的数据传输负担。
总结
将查询参数和响应模型结合使用,是提升接口灵活性与可维护性的有效方式。通过这种方式,开发者可以根据实际需求动态生成响应数据,从而提供更加个性化的 API 接口。同时,FastAPI 的强大数据验证功能使得开发者可以高效地管理查询参数的校验,避免不必要的错误。
相关文章:
高效开发 Python Web 应用:FastAPI 数据验证与响应体设计
高效开发 Python Web 应用:FastAPI 数据验证与响应体设计 目录 🧑💻 FastAPI 的数据验证系统与 Pydantic 模型📦 响应体与模型:定义响应数据的最佳实践🔄 响应模型与查询参数的结合:增强灵活…...
基于“开源 2+1 链动 O2O 商城小程序”的门店拉新策略与流程设计
摘要:在数字化商业浪潮席卷之下,实体门店面临着激烈的市场竞争,如何高效拉新成为关乎门店生存与发展的关键问题。本文聚焦于“开源 21 链动 O2O 商城小程序”,深入探讨结合多种手段的门店拉新策略及详细流程设计。通过剖析到店扫码…...
33.5 remote实战项目之设计prometheus数据源的结构
本节重点介绍 : 项目要求 通过remote read读取prometheus中的数据通过remote write向prometheus中写入数据 准备工作 新建项目 prome_remote_read_write设计prometheus 数据源的结构初始化 项目要求 通过remote read读取prometheus中的数据通过remote write向prometheus中写…...
微服务springboot详细解析(一)
目录 1.Spring概述 2.什么是SpringBoot? 3.第一个SpringBoot程序 4.配置参数优先级 5.springboot自动装配原理 6.SpringBootApplication&SpringApplication.run 7.ConfigurationProperties(prefix "") 8.Validated数据校验 29、聊聊该如何写一…...
深入探讨Go语言中的双向链表
简介 双向链表是链表家族中的一种高级结构,每个节点不仅指向下一个节点,还指向上一个节点。今天,我们将学习如何在Go语言中实现和操作这种灵活的数据结构。 双向链表的优缺点 优点: 可以从任一方向遍历链表,灵活性高…...
Fastapi + vue3 自动化测试平台---移动端App自动化篇
概述 好久写文章了,专注于新框架,新UI界面的实践,废话不多说,开搞 技术架构 后端: Fastapi Airtest multiprocessing 前端: 基于 Vue3、Vite、TypeScript、Pinia、Pinia持久化插件、Unocss 和 Elemen…...
ElasticSearch easy-es 聚合函数 group by 混合写法求Top N 词云 分词
1.将用户访问记录表数据同步到ES,并且分词,获取用户访问最多前十条词语。 Elasticsearch、Easy-es 快速入门 SearchAfterPage分页 若依前后端分离 Ruoyi-Vue SpringBoot 使用结巴分词器 <!-- 分词器--><dependency><groupId>com.hua…...
在 ASP.NET C# Web API 中实现 Serilog 以增强请求和响应的日志记录
介绍 日志记录是任何 Web 应用程序的关键方面。它有助于调试、性能监控和了解用户交互。在 ASP.NET C# 中,集成 Serilog 作为记录请求和响应(包括传入和传出的数据)的中间件可以显著提高 Web API 的可观察性和故障排除能力。 在过去的几周里&…...
2024年顶级小型语言模型前15名
本文,我们将深入了解2024年备受瞩目的十五款小型语言模型(SLMs),它们分别是Llama 3.1 8B、Gemma2、Qwen 2、Mistral Nemo、Phi-3.5等。这些SLMs以其精巧的体积和高效率著称,它们不需要依赖庞大的服务器资源,…...
精通 Python 网络安全(一)
前言 最近,Python 开始受到越来越多的关注,最新的 Python 更新添加了许多可用于执行关键任务的包。我们的主要目标是帮助您利用 Python 包来检测和利用漏洞,并解决网络挑战。 本书将首先带您了解与网络和安全相关的 Python 脚本和库。然后&…...
【python自动化二】pytest集成allure生成测试报告
pytest本身不会直接生成测试报告,而allure是一种生成测试报告的公共插件,可与多种测试框架配合生成测试报告,本文介绍下如何集成allure生成测试报告。 1.allure安装 1.安装allure-pytest 先安装allure的pytest插件,用于在pytes…...
网络版本的通讯录青春版(protobuf)
环境搭建 Protobuf 还常⽤于通讯协议、服务端数据交换场景。 因为我们主要目的只是为了学习protobuf,因此对于客户端,原本应该具备: 新增⼀个联系⼈ ◦ 删除⼀个联系⼈ ◦ 查询通讯录列表 ◦ 查询⼀个联系⼈的详细信息 这样四个功能。 …...
开源模型应用落地-安全合规篇-用户输入价值观判断(三)
一、前言 在深度合规功能中,对用户输入内容的价值观判断具有重要意义。这一功能不仅仅是对信息合法性和合规性的简单审核,更是对信息背后隐含的伦理道德和社会责任的深刻洞察。通过对价值观的判断,系统能够识别可能引发不当影响或冲突的内容,从而为用户提供更安全、更和谐的…...
神经网络入门实战:(十四)pytorch 官网内置的 CIFAR10 数据集,及其网络模型
(一) pytorch 官网内置的网络模型 图像处理: Models and pre-trained weights — Torchvision 0.20 documentation (二) CIFAR10数据集的分类网络模型(仅前向传播): 下方的网络模型图片有误,已做修改,具…...
【Rust在WASM中实现pdf文件的生成】
Rust在WASM中实现pdf文件的生成 前言概念和依赖问题描述分步实现pdf转Blob生成URL两种方式利用localstorage传递参数处理图片Vec<u8>到pdf格式的Vec<u8>使用rust创建iframe显示pdf的Blob最后 前言 实现了一个通用的前端jpg转pdf的wasm,因为动态响应框架无法直接打…...
在MySQL中执行sum case when报错:SUM does not exist
1. 报错 在pgsql中能正常运行的一段SQL在MySQL中运行的时候报错了: SELECT DATE( hr.handle_time ) AS statsDate,SUM ( CASE WHEN hma.app_type IN ( 2, 5 ) THEN ch_money ELSE 0 END ) AS aliPayAmt,SUM ( CASE WHEN hma.app_type IN ( 1, 4 ) THEN ch_money EL…...
【openssl】相关指令
熟悉下相关概念 x509:证书标准pem和der:两种(包括公私钥、证书签名请求、证书等内容的)的格式,前者是文本形式,linux常用,后者是二进制形式,windows常用,仅仅是格式&…...
实例分割详解
实例分割详解 引言 实例分割是计算机视觉领域的一项复杂任务,它要求模型能够识别图像中不同类别的对象,并对每个单独的对象进行像素级别的分类。与语义分割不同的是,实例分割不仅要区分不同的类别,还要识别同一类别中的不同个体…...
D87【python 接口自动化学习】- pytest基础用法
day87 pytest运行参数 -m -k 学习日期:20241203 学习目标:pytest基础用法 -- pytest运行参数-m -k 学习笔记: 常用运行参数 pytest运行参数-m -k pytest -m 执行特定的测试用例,markers最好使用英文 [pytest] testpaths./te…...
浅谈MySQL路由
华子目录 mysql-router介绍下载mysql-router安装mysql-router实验 mysql-router介绍 mysql-router是一个对应用程序透明的InnoDB Cluster连接路由服务,提供负载均衡、应用连接故障转移和客户端路由利用路由器的连接路由特性,用户可以编写应用程序来连接到…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
