当前位置: 首页 > news >正文

高效开发 Python Web 应用:FastAPI 数据验证与响应体设计

高效开发 Python Web 应用:FastAPI 数据验证与响应体设计

目录

  1. 🧑‍💻 FastAPI 的数据验证系统与 Pydantic 模型
  2. 📦 响应体与模型:定义响应数据的最佳实践
  3. 🔄 响应模型与查询参数的结合:增强灵活性与可维护性

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 模型的优势

  1. 类型安全:Pydantic 使用 Python 的类型注解来定义模型,使得数据验证变得直观且易于理解。即使数据类型不匹配,FastAPI 会自动抛出相应的错误信息。
  2. 嵌套验证:通过嵌套模型,可以进行更复杂的数据结构验证。例如,如果模型中的一个字段本身是另一个 Pydantic 模型,Pydantic 会自动验证内部数据的正确性。
  3. 自动文档生成:基于 Pydantic 模型,FastAPI 会自动生成文档,帮助开发者快速了解接口的使用方式和数据要求。文档也可以实时反映数据类型和验证规则。
  4. 动态校验: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

响应体模型的作用

  1. 自动映射与格式化:通过 response_model 参数,FastAPI 会自动将函数返回的数据映射到 Pydantic 模型,并根据模型定义进行格式化。任何不符合模型结构的数据都会被丢弃或转换,从而确保返回的数据符合预期格式。
  2. 清晰的接口定义:响应体的模型不仅能确保返回数据的一致性,还能提供清晰的接口文档,帮助前端开发人员准确了解 API 的返回结构。
  3. 自动数据校验: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 接口通过 nameprice_minprice_max 查询参数来过滤返回的商品列表。这种方式不仅增强了 API 的灵活性,还能有效减小前端和后端之间的数据传输负担。

总结

将查询参数和响应模型结合使用,是提升接口灵活性与可维护性的有效方式。通过这种方式,开发者可以根据实际需求动态生成响应数据,从而提供更加个性化的 API 接口。同时,FastAPI 的强大数据验证功能使得开发者可以高效地管理查询参数的校验,避免不必要的错误。

相关文章:

高效开发 Python Web 应用:FastAPI 数据验证与响应体设计

高效开发 Python Web 应用&#xff1a;FastAPI 数据验证与响应体设计 目录 &#x1f9d1;‍&#x1f4bb; FastAPI 的数据验证系统与 Pydantic 模型&#x1f4e6; 响应体与模型&#xff1a;定义响应数据的最佳实践&#x1f504; 响应模型与查询参数的结合&#xff1a;增强灵活…...

基于“开源 2+1 链动 O2O 商城小程序”的门店拉新策略与流程设计

摘要&#xff1a;在数字化商业浪潮席卷之下&#xff0c;实体门店面临着激烈的市场竞争&#xff0c;如何高效拉新成为关乎门店生存与发展的关键问题。本文聚焦于“开源 21 链动 O2O 商城小程序”&#xff0c;深入探讨结合多种手段的门店拉新策略及详细流程设计。通过剖析到店扫码…...

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&#xff1f; 3.第一个SpringBoot程序 4.配置参数优先级 5.springboot自动装配原理 6.SpringBootApplication&SpringApplication.run 7.ConfigurationProperties(prefix "") 8.Validated数据校验 29、聊聊该如何写一…...

深入探讨Go语言中的双向链表

简介 双向链表是链表家族中的一种高级结构&#xff0c;每个节点不仅指向下一个节点&#xff0c;还指向上一个节点。今天&#xff0c;我们将学习如何在Go语言中实现和操作这种灵活的数据结构。 双向链表的优缺点 优点&#xff1a; 可以从任一方向遍历链表&#xff0c;灵活性高…...

Fastapi + vue3 自动化测试平台---移动端App自动化篇

概述 好久写文章了&#xff0c;专注于新框架&#xff0c;新UI界面的实践&#xff0c;废话不多说&#xff0c;开搞 技术架构 后端&#xff1a; Fastapi Airtest multiprocessing 前端&#xff1a; 基于 Vue3、Vite、TypeScript、Pinia、Pinia持久化插件、Unocss 和 Elemen…...

ElasticSearch easy-es 聚合函数 group by 混合写法求Top N 词云 分词

1.将用户访问记录表数据同步到ES&#xff0c;并且分词&#xff0c;获取用户访问最多前十条词语。 Elasticsearch、Easy-es 快速入门 SearchAfterPage分页 若依前后端分离 Ruoyi-Vue SpringBoot 使用结巴分词器 <!-- 分词器--><dependency><groupId>com.hua…...

在 ASP.NET C# Web API 中实现 Serilog 以增强请求和响应的日志记录

介绍 日志记录是任何 Web 应用程序的关键方面。它有助于调试、性能监控和了解用户交互。在 ASP.NET C# 中&#xff0c;集成 Serilog 作为记录请求和响应&#xff08;包括传入和传出的数据&#xff09;的中间件可以显著提高 Web API 的可观察性和故障排除能力。 在过去的几周里&…...

2024年顶级小型语言模型前15名

本文&#xff0c;我们将深入了解2024年备受瞩目的十五款小型语言模型&#xff08;SLMs&#xff09;&#xff0c;它们分别是Llama 3.1 8B、Gemma2、Qwen 2、Mistral Nemo、Phi-3.5等。这些SLMs以其精巧的体积和高效率著称&#xff0c;它们不需要依赖庞大的服务器资源&#xff0c…...

精通 Python 网络安全(一)

前言 最近&#xff0c;Python 开始受到越来越多的关注&#xff0c;最新的 Python 更新添加了许多可用于执行关键任务的包。我们的主要目标是帮助您利用 Python 包来检测和利用漏洞&#xff0c;并解决网络挑战。 本书将首先带您了解与网络和安全相关的 Python 脚本和库。然后&…...

【python自动化二】pytest集成allure生成测试报告

pytest本身不会直接生成测试报告&#xff0c;而allure是一种生成测试报告的公共插件&#xff0c;可与多种测试框架配合生成测试报告&#xff0c;本文介绍下如何集成allure生成测试报告。 1.allure安装 1.安装allure-pytest 先安装allure的pytest插件&#xff0c;用于在pytes…...

网络版本的通讯录青春版(protobuf)

环境搭建 Protobuf 还常⽤于通讯协议、服务端数据交换场景。 因为我们主要目的只是为了学习protobuf&#xff0c;因此对于客户端&#xff0c;原本应该具备&#xff1a; 新增⼀个联系⼈ ◦ 删除⼀个联系⼈ ◦ 查询通讯录列表 ◦ 查询⼀个联系⼈的详细信息 这样四个功能。 …...

开源模型应用落地-安全合规篇-用户输入价值观判断(三)

一、前言 在深度合规功能中,对用户输入内容的价值观判断具有重要意义。这一功能不仅仅是对信息合法性和合规性的简单审核,更是对信息背后隐含的伦理道德和社会责任的深刻洞察。通过对价值观的判断,系统能够识别可能引发不当影响或冲突的内容,从而为用户提供更安全、更和谐的…...

神经网络入门实战:(十四)pytorch 官网内置的 CIFAR10 数据集,及其网络模型

(一) pytorch 官网内置的网络模型 图像处理&#xff1a; Models and pre-trained weights — Torchvision 0.20 documentation (二) CIFAR10数据集的分类网络模型&#xff08;仅前向传播&#xff09;&#xff1a; 下方的网络模型图片有误&#xff0c;已做修改&#xff0c;具…...

【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中运行的时候报错了&#xff1a; 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&#xff1a;证书标准pem和der&#xff1a;两种&#xff08;包括公私钥、证书签名请求、证书等内容的&#xff09;的格式&#xff0c;前者是文本形式&#xff0c;linux常用&#xff0c;后者是二进制形式&#xff0c;windows常用&#xff0c;仅仅是格式&…...

实例分割详解

实例分割详解 引言 实例分割是计算机视觉领域的一项复杂任务&#xff0c;它要求模型能够识别图像中不同类别的对象&#xff0c;并对每个单独的对象进行像素级别的分类。与语义分割不同的是&#xff0c;实例分割不仅要区分不同的类别&#xff0c;还要识别同一类别中的不同个体…...

D87【python 接口自动化学习】- pytest基础用法

day87 pytest运行参数 -m -k 学习日期&#xff1a;20241203 学习目标&#xff1a;pytest基础用法 -- pytest运行参数-m -k 学习笔记&#xff1a; 常用运行参数 pytest运行参数-m -k pytest -m 执行特定的测试用例&#xff0c;markers最好使用英文 [pytest] testpaths./te…...

浅谈MySQL路由

华子目录 mysql-router介绍下载mysql-router安装mysql-router实验 mysql-router介绍 mysql-router是一个对应用程序透明的InnoDB Cluster连接路由服务&#xff0c;提供负载均衡、应用连接故障转移和客户端路由利用路由器的连接路由特性&#xff0c;用户可以编写应用程序来连接到…...

matlab中disp,fprintf,sprintf,display,dlmwrite输出函数之间的区别

下面是他们之间的区别&#xff1a; disp函数与fprintf函数的区别 输出格式的灵活性 disp函数&#xff1a;输出格式相对固定。它会自动将变量以一种比较直接的方式显示出来。对于数组&#xff0c;会按照行列形式展示&#xff1b;对于字符串&#xff0c;直接原样输出并换行。例如…...

30.100ASK_T113-PRO 用QT编写视频播放器(一)

1.再buildroot中添加视频解码库 X264, 执行 make menuconfig Target packages -->Libraries --> Multimedia --> X264 CLI 还需要添加 FFmpeg 2. 保存,重新编译 make all 3.将镜像下载开发板...

Linux-GPIO应用编程

本章介绍应用层如何控制 GPIO&#xff0c;譬如控制 GPIO 输出高电平、或输出低电平。 只要是用到GPIO的外设&#xff0c;都有可能用得到这些操作方法。 照理说&#xff0c;GPIO的操作应该是由驱动层去做的&#xff0c;使用寄存器操作或者GPIO子系统之类的框架。 但是&#xff0…...

opencvocr识别手机摄像头拍摄的指定区域文字,文字符合规则就语音报警

安装python&#xff0c;pycharm&#xff0c;自行安装。 Python下安装OpenCv 2.1 打开cmd,先安装opencv-python pip install opencv-python --user -i https://pypi.tuna.tsinghua.edu.cn/simple2.2 再安装opencv-contrib-python pip install opencv-contrib-python --user …...

微服务即时通讯系统(5)用户管理子服务,网关子服务

用户管理子服务&#xff08;user文件&#xff09; 用户管理子服务也是这个项目中的一个业务最多的子服务&#xff0c;接口多&#xff0c;但是主要涉及的数据表只有user表&#xff0c;Redis的键值对和ES的一个搜索引擎&#xff0c;主要功能是对用户的个人信息进行修改管理&#…...

postgreSQL安装后启动有The application server could not be contacted问题

不得不说pgsql是真的麻烦,找问题找了几个小时才解决.直接步入主题吧 首先问题如下 安装后,双击启动就出现上述问题 首先删除路径为 c:\Users\your_name\AppData\Roaming\pgAdmin 之内的所有文件和文件夹, 如果找不到AppData,就把这个点开 接着找到你安装pgsql的路径,我的是D…...

架构05-架构安全性

零、文章目录 架构05-架构安全性 1、软件架构安全的重要性 **系统安全&#xff1a;**不仅包括防御黑客攻击&#xff0c;还包括安全备份与恢复、安全审计、防治病毒等。**关注重点&#xff1a;**认证、授权、凭证、保密、传输安全、验证。 2、认证&#xff08;Authenticatio…...

虚幻引擎---材质篇

一、基础知识 虚幻引擎中的材质&#xff08;Materials&#xff09; 定义了场景中对象的表面属性&#xff0c;包括颜色、金属度、粗糙度、透明度等等&#xff1b;可以在材质编辑器中可视化地创建和编辑材质&#xff1b;虚幻引擎的渲染管线的着色器是用高级着色语言&#xff08;…...

NPM镜像详解

NPM镜像详解 什么是NPM镜像 NPM镜像&#xff08;NPM Mirror&#xff09;是一个完整的NPM包的副本服务器。由于npm的官方registry服务器部署在国外&#xff0c;国内访问可能会比较慢&#xff0c;因此使用镜像可以加快包的下载速度。 常用的NPM镜像源 npm官方镜像 https://reg…...

从智能合约到去中心化AI:Web3的技术蓝图

Web3正在成为互联网发展的重要方向&#xff0c;其核心理念是去中心化、用户主权和自治。随着区块链技术、智能合约以及人工智能&#xff08;AI&#xff09;等技术的发展&#xff0c;Web3不仅重新定义了数据存储和交易方式&#xff0c;还为更智能化、去中心化的数字生态系统铺平…...