首页 > 其他分享 >Pydantic 详解:FastAPI 中的数据验证神器

Pydantic 详解:FastAPI 中的数据验证神器

时间:2024-08-30 15:55:28浏览次数:14  
标签:异步 name Flask FastAPI item 详解 Pydantic

FastAPI 是一个现代的、快速的 Web 框架,用于构建 API。它基于 ASGI (Asynchronous Server Gateway Interface),这使得 FastAPI 能够支持异步请求处理,从而提供高性能的 Web 服务。FastAPI 利用 Python 类型提示来增强开发体验,通过类型提示进行自动的数据验证和自动文档生成。

Pydantic 是一个数据验证和设置管理库,它使用 Python 类型注解来验证输入数据的类型和结构。在 FastAPI 中,Pydantic 主要用于以下方面:

  1. 数据验证:确保接收到的数据符合预期的格式和类型。
  2. 数据转换:将接收到的数据转换为 Python 类型。
  3. 自动文档:基于 Pydantic 模型自动生成 API 文档。

FastAPI 和 Pydantic 的关系实例

假设我们正在创建一个电子商务平台的 API,我们需要一个模型来接收商品信息:

from fastapi import FastAPI
from pydantic import BaseModel, ValidationError, EmailStr

app = FastAPI()

class Item(BaseModel):
    name: str
    description: str = None
    price: float
    is_available: bool = True
    owner_email: EmailStr

@app.post("/items/")
async def create_item(item: Item):
    return {"name": item.name, "price": item.price}

与 Flask 的比较

Flask 是一个轻量级的 Web 框架,它没有内建的数据验证和自动文档生成功能。使用 Flask 时,开发者通常需要手动验证数据,并且可能需要使用额外的库(如 Marshmallow)来进行序列化和验证。

以下是使用 Flask 和 Pydantic 进行相同任务的一个简单示例

from flask import Flask, request, jsonify
from pydantic import BaseModel, ValidationError
from email_validator import validate_email, EmailNotValidError

app = Flask(__name__)

class Item(BaseModel):
    name: str
    description: str = None
    price: float
    is_available: bool = True

@app.route("/items/", methods=["POST"])
def create_item():
    try:
        item_data = request.get_json()
        item = Item(**item_data)  # 手动创建 Pydantic 模型实例并验证
        return jsonify({"name": item.name, "price": item.price}), 201
    except ValidationError as e:
        return jsonify(e.errors()), 400

if __name__ == "__main__":
    app.run(debug=True)

在这个 Flask 示例中,我们手动解析 JSON 请求体并尝试创建一个 Item 模型实例来进行验证。如果数据不符合模型定义,我们需要手动处理 ValidationError

关键差异

  • 数据验证:FastAPI 与 Pydantic 紧密集成,自动处理数据验证,而 Flask 需要手动处理或使用额外的库。
  • 自动文档:FastAPI 可以自动从 Pydantic 模型生成文档,Flask 通常需要使用插件如 Flask-Swagger 来生成文档。
  • 性能:FastAPI 支持异步处理,适合高并发场景,而 Flask 是同步的,可能在高并发下成为瓶颈。
  • 易用性:FastAPI 提供了更现代的语言特性和更简洁的 API 设计,而 Flask 以简单和灵活著称,但在某些方面可能需要更多的样板代码。

通过这些比较,我们可以看到 FastAPI 和 Pydantic 的结合为构建高性能和易于维护的 API 提供了强大的工具集,而 Flask 则提供了更多的控制自由度,但需要开发者做更多的工作来实现相同的功能

FastAPI 和 Flask 在性能上的差异主要体现在以下几个方面:

  1. 异步处理能力

    • FastAPI 基于 ASGI,支持异步请求处理,这使得它在处理 I/O 密集型任务时非常高效,能够更好地利用系统资源,提高并发处理能力。
    • Flask 基于 WSGI,是一个同步框架,虽然可以通过使用异步库(如 Flask-AsyncIO)来增加异步功能,但这并不是 Flask 的核心功能,且使用起来可能更复杂。
  2. 性能

    • FastAPI 由于其异步特性,通常在高并发场景下表现更好。它可以同时处理更多的请求,而不需要为每个请求分配单独的线程或进程。
    • Flask 在低并发或请求处理时间较短的情况下表现良好,但在高并发情况下,由于其同步本质,可能需要更多的资源来处理相同的负载。
  3. 资源使用

    • FastAPI 的异步特性意味着它可以在单个线程中处理多个请求,从而减少线程切换的开销,提高资源使用效率。
    • Flask 作为同步框架,可能需要更多的线程或进程来处理并发请求,这可能导致更高的资源消耗。
  4. 框架开销

    • FastAPI 由于其现代化的设计和对异步的支持,可能在某些情况下具有更低的框架开销。
    • Flask 是一个轻量级的框架,但在处理高并发请求时,由于其同步模型,可能需要更多的资源来维持性能。

关于性能测试的数据支持,FastAPI 的官方文档和许多在线资源提供了一些基准测试结果。例如,FastAPI 的性能经常与 NodeJS 和 Go 等其他高性能语言和框架进行比较,显示出具有竞争力的性能。然而,具体的性能测试结果可能会因测试环境、数据集大小、请求类型和服务器配置等因素而有所不同。

标签:异步,name,Flask,FastAPI,item,详解,Pydantic
From: https://blog.csdn.net/ylong52/article/details/141720364

相关文章

  • 视频美颜SDK的核心技术:打造智能化主播美颜工具详解
    视频美颜SDK不仅提升了视频质量,还为主播们提供了智能化、个性化的美颜功能。那么,视频美颜SDK的核心技术究竟是什么?又是如何为主播打造智能化美颜工具的呢? 1.人脸检测与特征点识别视频美颜SDK技术通过深度学习算法,能够在视频流中快速、准确地检测到人脸,并识别多个特征点。这些特征......
  • 全网最详细爬虫教学-刚学Python也行-方法详解-看我这篇就够了-第一节
        前言        很多人一听到爬虫脑子里就想到黑客,顶级程序员等。但其实爬虫不难,今天,我就来教大家快速入门爬虫。    requests库        说到爬虫,就不得不提request库了,它能提取静态网页源码(静态网页!!!),例如百度就是个静态网站,实战演练一下。......
  • 二. Spring Boot 中的 “依赖管理和自动配置” 详解透彻到底(附+详细代码流程)
    二.SpringBoot中的“依赖管理和自动配置”详解透彻到底(附+详细代码流程)@目录*二.SpringBoot中的“依赖管理和自动配置”详解透彻到底(附+详细代码流程)1.如何理解“约定优于配置”2.SpringBoot依赖管理和自动配置2.1SpringBoot的依赖管理2.1.1什么......
  • Windows安全日志分析实战:15个关键事件ID详解
    Windows安全日志分析实战:15个关键事件ID详解原创 VlangCN HW安全之路  2024年08月27日07:30 山东各位读者朋友们好,我是v浪。都2024年了,浪哥估计又阳了。但是没关系,今天同样大家带来一篇实用性很强的文章-Windows关键事件ID盘点。作为网络安全从业人员,了解这些......
  • Spring EL表达式使用详解
    SpringEL表达式使用详解什么是SpringEL表达式SpringEL表达式是Spring表达式语言,支持在xml和注解中使用表达式,类似于JSP的EL,JSTL表达式语言。Spring开发中我们会经常涉及到调用各种资源的情况,包含普通文件、网址、正则表达式、系统变量、其他Bean的一些属性、配置文件、集......
  • 求两点间最短路的Dijkstra算法及其matlab程序详解
    #################本文为学习《图论算法及其MATLAB实现》的学习笔记#################设源点为u0u_{0}u0​,目标......
  • 分布式计算架构详解以及任务调度方式
    信息技术领域重要分支—分布式计算。分布式计算通过将任务分配到多个物理的计算资源上进行处理,以来提高计算效率和资源利用率。今天主讲分布式计算架构的关键组成以及在云服务器背景下任务调度的不同方式,然后再综合来看这些调度策略是怎样适应云环境的动态性和可扩展性。以前的集中......
  • 数据结构-单链表-详解-1
    数据结构-单链表-详解-11.前言2.结点3.打印3.1关于断言3.2下一结点的找法物理结构逻辑结构1.前言在数据结构-顺序表-详解中,我详细介绍了顺序表的实现,而顺序表也有一些缺点:中间,头部插入时,需整体挪动数据,效率低下。空间不够时扩容,有一定的消耗,也可能有一定空间浪费......
  • 【AI绘画】Midjourney前置指令/blend、/info、/subscribe详解
    文章目录......
  • Makefile 基础与常用语法详解
    目录 一、引言二、Makefile基础概念1.目标、依赖和命令2.文件名和搜索路径3.执行顺序和依赖关系三、Makefile常用语法1.变量和宏定义2.自动变量3.模式规则 4.条件判断5.循环6.伪目标 四、Makefile实际应用示例五、总结 一、引言        在......