FastAPI 进阶:使用 Pydantic 验证器增强 Query 参数验证

news/2024/9/19 1:04:12/ 标签: fastapi, python

在 FastAPI 中,为 Query 类参数添加更复杂的验证逻辑可以通过以下几种方法实现:

  1. 使用 Pydantic 验证器
    Pydantic 允许你在模型中定义自定义验证器。这些验证器可以用于 Query 参数,以实现复杂的验证逻辑。

    python">from fastapi import FastAPI, Query, Depends, HTTPException
    from pydantic import BaseModel, validatorapp = FastAPI()class QueryParameters(BaseModel):q: str@validator('q')def check_custom_logic(cls, value):# 这里可以添加任何复杂的逻辑if 'forbidden' in value:raise ValueError('The value is not allowed')return value@app.get("/items/")
    async def read_items(q: QueryParameters = Depends()):return {"q": q.q}
    
  2. 使用前置依赖函数
    通过在路由函数中使用 Depends,你可以创建一个前置依赖函数来执行复杂的验证逻辑。

    python">from fastapi import FastAPI, Depends, Query, HTTPExceptionapp = FastAPI()def complex_query_validator(query: str):if not query.startswith("allowed_"):raise HTTPException(status_code=400, detail="Query parameter does not follow the rules")return query@app.get("/items/")
    async def read_items(q: str = Depends(complex_query_validator)):return {"q": q}
    
  3. 使用正则表达式
    Query 类支持 regex 参数,你可以使用它来定义一个正则表达式,用于验证查询参数的格式。

    python">from fastapi import FastAPI, Queryapp = FastAPI()@app.get("/items/")
    async def read_items(q: str = Query(..., regex="^[a-zA-Z0-9]+$")):return {"q": q}
    
  4. 组合使用 Query 参数
    你可以组合使用多个 Query 参数,并在路由函数中实现逻辑来验证这些参数的组合。

    python">from fastapi import FastAPI, Queryapp = FastAPI()@app.get("/items/")
    async def read_items(min_price: float = Query(gt=0), max_price: float = Query(gt=0)):if min_price >= max_price:raise ValueError("min_price should be less than max_price")return {"min_price": min_price, "max_price": max_price}
    
  5. 使用自定义依赖项类
    你可以创建自定义的依赖项类,这些类继承自 Depends 并实现 __call__ 方法,以封装复杂的验证逻辑。

    python">from fastapi import FastAPI, Depends, Queryapp = FastAPI()class CustomQuery:def __call__(self, query: str):if not query.isalpha():raise ValueError("Query must contain only letters")return query@app.get("/items/")
    async def read_items(q: str = Depends(CustomQuery())):return {"q": q}
    
  6. 使用外部库
    如果需要,你可以使用外部验证库(如 Marshmallow Cerberus)来实现复杂的验证逻辑,并将验证结果作为依赖项注入路由函数。

通过这些方法,你可以为 FastAPI 应用中的 Query 类参数添加几乎任何复杂度的验证逻辑,确保输入数据的准确性和安全性。

在 FastAPI 应用中,为 Query 参数编写 Pydantic 验证器可以让你实现复杂的验证逻辑。以下是如何为 Query 参数创建和使用 Pydantic 验证器的步骤:

  1. 定义 Pydantic 模型
    创建一个 Pydantic 模型,并在模型中定义你的 Query 参数以及相应的验证器。

  2. 编写验证器
    使用模型中的 @validator 装饰器来创建一个验证器函数,该函数将包含你的验证逻辑。

  3. 使用依赖注入
    在路由函数中,使用 Depends 来注入你的模型实例,这样 FastAPI 就会在调用路由函数之前执行验证逻辑。

下面是一个示例代码,展示了如何为 Query 参数编写 Pydantic 验证器:

python">from fastapi import FastAPI, Depends, Query
from pydantic import BaseModel, Field, validator
from typing import Union, Optionalapp = FastAPI()# 定义 Pydantic 模型
class QueryParameters(BaseModel):q: Optional[str] = Nonesize: Optional[int] = Query(default=None, gt=0)# 验证器,确保 'q' 参数不为空,且 'size' 大于 0@validator('q', pre=True, always=True)def check_q_not_empty(cls, v):if v is None or v == "":raise ValueError("Query parameter 'q' cannot be empty")return v@validator('size', pre=True, allow_reuse=True)def check_size_positive(cls, v):if v is not None and v <= 0:raise ValueError("Query parameter 'size' must be greater than 0")return v# 依赖项函数,返回验证后的 QueryParameters 实例
def validate_query_params(params: QueryParameters = Depends()):return params# 路由函数
@app.get("/items/")
async def read_items(query_params: QueryParameters = Depends(validate_query_params)):results = {"q": query_params.q, "size": query_params.size}return results

在这个例子中:

  • QueryParameters 类定义了两个查询参数 qsize
  • check_q_not_empty 验证器确保 q 参数不为空。
  • check_size_positive 验证器确保 size 参数大于 0。
  • validate_query_params 函数作为依赖项,它使用 Depends 注解来注入 QueryParameters 实例。
  • 在路由函数 read_items 中,我们通过依赖项注入获取验证后的参数。

当请求到达 /items/ 路由时,FastAPI 会首先调用 validate_query_params 函数来验证查询参数,如果验证失败,它会返回错误响应。如果验证成功,路由函数将接收到验证后的参数值。


http://www.ppmy.cn/news/1519843.html

相关文章

设计模式--装饰器模式

装饰器模式 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许我们向一个现有的对象添加新的功能&#xff0c;同时又不改变其结构。就增加功能来说&#xff0c;装饰器模式相比生成子类更为灵活。这种模式创建了一个包装对象&#xf…

51单片机-LED闪烁

时间&#xff1a;2024.8.28 作者&#xff1a;Whappy 目的&#xff1a;学习51单片机 代码&#xff1a; #include <REGX52.H> #include "intrins.h"void Delay500ms() //11.0592MHz {unsigned char i, j, k;_nop_();i 4;j 129;k 119;do{do{while (--k);} …

音视频解码 AVIO内存输入模式

原因 根据下文&#xff0c;我们已经学会了如何从本地文件读取数据&#xff0c;对音视频进行解码操作得到原始数据。 ffmpeg 音视频解码-CSDN博客 现在有一个需求&#xff0c;网络读取到的数据&#xff0c;也就是内存数据如何直接进行解码操作&#xff1f; 本文就是介绍解决…

特种设备作业气瓶作业试题附答案

1.液化石油气瓶检验完毕后&#xff0c;逐只进行抽真空其主要目的是()。 A、提高气体的纯度 B、防止形成爆鸣气体 C、验证检验质量 D、提高充装速度 答案:B 2.无“()”监督检验钢印标记的气瓶严禁充装。 A、SC B、CC C、TS D、SS 答案:C 3.特种气瓶是指()。 A、盛装液化石油气…

微积分复习笔记 Calculus Volume 1 - 1.3Trigonometric Functions

1.3 Trigonometric Functions - Calculus Volume 1 | OpenStax

H264码流结构讲解

所谓的码流结构就是指&#xff1a;视频经过编码之后所得到的数据是怎样排列的&#xff0c;换句话说&#xff0c;就是编码后的码流我们该如何将一帧一帧的数据分离开来&#xff0c;哪一块数据是一帧图像&#xff0c;哪一块是另外一帧图像&#xff0c;只要了解了这个&#xff0c;…

【原型模式】

原型模式 Prototype Pattern 属于创建型模式是指原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型创建新的对象&#xff0c;调用者不需要知道任何创建细节&#xff0c;不调用构造函数关键点&#xff1a;不通过 new 关键字&#xff0c;而是通过方法去创建对象 原型模…

高职院校人工智能训练师边缘计算实训室建设方案

一、引言 随着人工智能技术的飞速发展&#xff0c;边缘计算在提升数据处理效率、降低延迟、保护数据安全等方面展现出巨大潜力。高职院校作为技能型人才培养的重要基地&#xff0c;建设人工智能训练师边缘计算实训室&#xff0c;旨在培养掌握前沿技术、具备实战能力的复合型人才…

自定义Shell程序(内附源码)

在这篇博客中&#xff0c;我们将深入探讨如何自行编写一个简单的Shell程序&#xff0c;我们的示例程序是一个用C语言编写的名为myshell的小型命令行界面。这个项目不仅是对操作系统如何通过命令行与用户互动的一个实用介绍&#xff0c;同时也展示了环境变量、进程创建和命令解析…

Python 全栈系列265 使用ORM、Kafka、Apscheduler实现任务的并发处理

说明 这次的尝试&#xff0c;从框架来说是比较成功的。但是不太走运的是&#xff0c;有一个小的磁盘回收没有写&#xff0c;结果在我外出旅游的时候磁盘打满&#xff0c;导致任务没有按预期执行完&#xff0c;这点比较遗憾。 这里快速把实现的框架梳理一下&#xff0c;后续可…

差旅游记|绵阳:生活的意义在于体验

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 几年前在微博上有个段子广为流传&#xff0c;说是梁朝伟哪天烦闷了&#xff0c;就去机场&#xff0c;赶上哪班就搭哪班&#xff0c;比如去伦敦广场晒太阳&#xff0c;发呆&#xff0c;喂鸽子&#xff0c;完了再搭最近…

Azure Data Factory 多选选项集不受支持

在用ADF往外部推数据时&#xff0c;会碰到CRM的一种数据类型&#xff0c;多选下拉框&#xff0c;如下图中的 如果我们把多选字段输入源字段中&#xff0c;会得到如下的提示 查询官方文档&#xff0c;则有如下的说法 所以把值往外推就需要变通下&#xff0c;例如使用一个文本字段…

爬虫:爬取MDPI杂志中国作者单位和邮箱

Python爬虫&#xff0c;简单来说&#xff0c;就是使用Python编程语言编写的一种自动化获取网页内容的程序。它们能够模拟人类浏览网页的行为&#xff0c;如访问网页、解析网页内容、甚至填写表单和点击链接等&#xff0c;从而帮助我们从互联网上大量收集和处理数据。Python爬虫…

dart 字符串截取

截取 String str "500001"; String lastThreeDigits str.substring(str.length - 3);在这个例子中&#xff0c;str.length - 3计算的是开始截取的索引位置&#xff0c;它从字符串的倒数第三个字符开始截取&#xff0c;一直到字符串的末尾。因此&#xff0c;lastTh…

Nginx学习(第二天)

一.Nginx高级配置 1.1 Nginx状态页 基于nginx 模块 ngx_http_stub_status_module 实现&#xff0c; 在编译安装nginx的时候需要添加编译参数 --with-http_stub_status_module 否则配置完成之后监测会是提示法错误 注意: 状态页显示的是整个服务器的状态,而非虚拟主机的状态 …

运维问题0001:MM模块-MIGO收货报错“消息号 M7036 对于采购订单********无收货可能”

1、问题解析&#xff1a; 该报错为SAP标准报错类型,针对公司不同配置/业务设计/校验逻辑&#xff0c;导致该问题原因比较多。 常见的问题总结如下&#xff1a; 1&#xff09;输入的PO信息有问题&#xff08;例如&#xff1a;PO输入错误/PO删除状态/PO冻结状态/PO已完成收货等…

【Next】3. 开发规范

笔记来源&#xff1a;编程导航 1、约定式路由 Next.js 使用 约定式路由&#xff0c;根据文件夹的结构和名称&#xff0c;自动将对应的 URL 地址映射到页面文件。 常见的几种路由规则如下&#xff1a; 1&#xff09;基础规则&#xff1a;以 app 目录作为根路径&#xff0c;根…

企微获客链接 中文乱码问题处理

企微获客链接 中文乱码问题处理 问题背景问题处理补充内容 问题背景 为了推广产品&#xff0c;同时更好的服务客户&#xff0c;公司在接入企业微信后&#xff0c;需要用到企微获客链接相关推广操作&#xff0c;那么通过API 接口创建企微获客链接时&#xff0c;出现了中文乱码问…

MYSQL————联合查询

联合多个表进行查询 设计数据时把表进行拆分&#xff0c;为了消除表中字段的依赖关系&#xff0c;比如部分函数依赖&#xff0c;传递依赖&#xff0c;这时会导致一条SQL查出来的数据&#xff0c;对于业务来说是不完整的&#xff0c;我们就可以使用联合查询把关系中的数据全部查…

Java 入门指南:Java 并发编程 —— Condition 灵活管理线程间的同步

Condition Condition 是 Java 并发编程中的一种高级同步工具&#xff0c;它可以协助线程之间进行等待和通信。提供了一种比传统的 wait() 和 notify() 更加灵活的方式来管理线程间的同步。Condition 接口通常与 Lock 接口一起使用&#xff0c;允许更细粒度的控制线程的等待和唤…