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

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

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

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

    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,你可以创建一个前置依赖函数来执行复杂的验证逻辑。

    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 参数,你可以使用它来定义一个正则表达式,用于验证查询参数的格式。

    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 参数,并在路由函数中实现逻辑来验证这些参数的组合。

    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__ 方法,以封装复杂的验证逻辑。

    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 验证器:

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 函数来验证查询参数,如果验证失败,它会返回错误响应。如果验证成功,路由函数将接收到验证后的参数值。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 汽车功能安全--TC3xx SMU之看门狗alarm处理
  • C语言操作符详解1(含进制转换,原反补码)
  • edge跟谷歌浏览器配置浏览器可跨域
  • SecurityHeaders:为.Net网站添加安全标头,让Web更加安全、避免攻击!
  • Quartz.Net_侦听触发器
  • C语言典型例题59
  • python 并发100个请求
  • IoT客户端+联邦学习微调大模型
  • 音视频入门基础:WAV专题(7)——FFmpeg源码中计算WAV音频文件每个packet的size值的实现
  • 【硬件知识】从零开始认识GPU
  • 【QT】学习笔记:导出资源中静态文件
  • JMeter 工具安装以及简单使用
  • 【网络安全】Bingbot索引投毒实现储存型XSS
  • 公司一般注册什么样的域名后缀?
  • 仿论坛项目--开发社区首页
  • JavaScript对象详解
  • Linux CTF 逆向入门
  • ng6--错误信息小结(持续更新)
  • Otto开发初探——微服务依赖管理新利器
  • python3 使用 asyncio 代替线程
  • React 快速上手 - 07 前端路由 react-router
  • tab.js分享及浏览器兼容性问题汇总
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • Yii源码解读-服务定位器(Service Locator)
  • 安卓应用性能调试和优化经验分享
  • 笨办法学C 练习34:动态数组
  • 漂亮刷新控件-iOS
  • 入门级的git使用指北
  • 网络应用优化——时延与带宽
  • 详解NodeJs流之一
  • 小程序 setData 学问多
  • 学习使用ExpressJS 4.0中的新Router
  • 找一份好的前端工作,起点很重要
  • 做一名精致的JavaScripter 01:JavaScript简介
  • Python 之网络式编程
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • # windows 安装 mysql 显示 no packages found 解决方法
  • (24)(24.1) FPV和仿真的机载OSD(三)
  • (AngularJS)Angular 控制器之间通信初探
  • (二)测试工具
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (转) RFS+AutoItLibrary测试web对话框
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET 8.0 中有哪些新的变化?
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET开发人员必知的八个网站
  • .NET中 MVC 工厂模式浅析
  • /var/lib/dpkg/lock 锁定问题
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798
  • [].slice.call()将类数组转化为真正的数组
  • [000-01-022].第03节:RabbitMQ环境搭建
  • [2019红帽杯]Snake