FastAPI查询参数和字符串校验

在FastAPI中,你可以为参数声明额外的信息和校验。这对于查询参数来说尤其有用,因为它们通常用于过滤或排序结果。本教程将引导你如何使用Query对象来添加这些额外的校验。

  1. 导入所需库

首先,你需要导入FastAPI以及Query对象:

from fastapi import FastAPI, Query
  1. 初始化应用

创建一个FastAPI实例:

app = FastAPI()
  1. 定义带有Query参数的路由

现在让我们定义一个简单的路由,它有一个名为status的查询参数。这个参数是一个字符串,用于指定返回的结果状态。我们将使用Query对象来指定一些额外的校验条件。

@app.get("/employees/")
async def read_employees(status: str = Query(default=None, max_length=10)):results = {"employees": [{"employee_id": "1", "name": "John Doe"}, {"employee_id": "2", "name": "Jane Smith"}]}if status:results.update({"status": status})return results

在这个例子中,我们设置了max_length参数为10,这意味着status参数的值不能超过10个字符。

  1. 添加更多校验

除了max_length之外,你还可以添加其他校验条件,比如min_lengthregex等。下面是一个例子:

@app.get("/employees/")
async def read_employees(status: str = Query(default=None, min_length=3, max_length=10, regex="^[a-zA-Z_]+$")
):results = {"employees": [{"employee_id": "1", "name": "John Doe"}, {"employee_id": "2", "name": "Jane Smith"}]}if status:results.update({"status": status})return results

在这个例子中,我们添加了min_length参数,确保status参数至少有3个字符。同时,我们还添加了一个正则表达式"^[a-zA-Z_]+$",表示status参数只能包含字母和下划线,正则表达式,几乎是我最常使用的参数验证方式,因为它实在是太强大了,有了它,几乎可以不使用其他的了,当然,需要去数据库查询再作出判断的除外,但是去数据库查询之前,一般都可以使用正则表达式进行初步的验证,这是我通常在实际开发中所使用的。

  1. 默认值和必需参数

如果你想要设置一个默认值,可以像这样使用default参数:

@app.get("/employees/")
async def read_employees(status: str = Query(default="active", min_length=3, max_length=10, regex="^[a-zA-Z_]+$")
):results = {"employees": [{"employee_id": "1", "name": "John Doe"}, {"employee_id": "2", "name": "Jane Smith"}]}if status:results.update({"status": status})return results

打开自动化测试文档可以看到,status参数并没有红色的*,表示它并不是必须的
在这里插入图片描述

在这个例子中,如果用户没有提供status参数,那么它的默认值将是"active"。

  1. 声明必需参数

如果你想让某个参数成为必需参数,只需不提供默认值即可。例如:

@app.get("/employees/")
async def read_employees(status: str = Query(min_length=3, max_length=10, regex="^[a-zA-Z_]+$")
):results = {"employees": [{"employee_id": "1", "name": "John Doe"}, {"employee_id": "2", "name": "Jane Smith"}]}if status:results.update({"status": status})return results

在这个例子中,status参数是必需的,因为没有提供默认值。
官方文档中,还有声明为...的方式来表示是必须参数,如下面的示例代码

from typing import Unionfrom fastapi import FastAPI, Queryapp = FastAPI()@app.get("/items/")
async def read_items(q: Union[str, None] = Query(default=..., min_length=3)):results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}if q:results.update({"q": q})return results

虽然可以是None,但是default中的...表示它仍然是必填参数,我们打开自动化文档测试工具就可以很明显的看到这一点
在这里插入图片描述
如果你觉得...不好理解或者很别扭,你可以用Required代替它,因为python号称最接近自然语言的编程语言,我们为什么不让程序更好懂呢。直接写成Required不是所有人都懂吗,干嘛弄成…呢,还以为是省略号呢?记住,我们写的代码别人一看就能懂,那才是牛人,而不是故意装大牛,故意让人看不懂。

总结

通过使用Query对象,你可以为查询参数添加各种校验条件,如最大长度、最小长度、正则表达式等。这可以帮助你确保接收到的数据满足你的预期,并且可以在OpenAPI模式中记录这些参数信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/255289.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

品牌拆解丨花知晓如何做到“少女心”天花板

少女会变老,但少女心不会。 “少女心”彩妆品牌花知晓这段时间特别出圈。 故事从花知晓品牌创始人包老板开始,第一次上综艺《所有女生的offer3》,在和李佳琦的谈判中,包老板温柔可爱的表现圈粉不少,199元带走4件正装…

8. 信号基础

8. 信号基础 1. 基本概念1.1 信号的目的是用来通信的1.2 信号由谁处理、怎么处理1.3 信号是异步的 2. 信号的分类2.1 可靠信号和不可靠信号2.2 实时信号和非实时信号 3. 进程对信号的处理3.1 signal()3.2 sigaction()3.2.1 struct sigaction3.2.2 实例 4. 向进程发送信号4.1 ki…

【java】Java程序员,你掌握了多线程吗?

摘要:互联网的每一个角落,无论是大型电商平台的秒杀活动,社交平台的实时消息推送,还是在线视频平台的流量洪峰,背后都离不开多线程技术的支持。在数字化转型的过程中,高并发、高性能是衡量系统性能的核心指…

两种做法——判断是否是二叉搜索树

https://leetcode.cn/problems/validate-binary-search-tree/description/?envTypestudy-plan-v2&envIdtop-interview-150 方法一:中序遍历 考虑只有两个节点和一个结点的情况,可以头尾各加一个最大最小值,不用特判了,也可…

一.初始typescript

什么是ts 首先我们要确认typescript是一个语言,是等同于JavaScript层级得,并不是一些人认为得是JavaScript得类型规范工具或者插件。 ts与js的差异 从type script这个名字就可以看出,ts其实是JavaScript的一个类型化超集,它增…

电脑搜不自己的手机热点,其余热点均可!

一、现象: 之前可正常连接,突然间发现收不到自己的WiFi信号,其余人均可收到。通过重复手机电脑关机、改变热点设置中的频段等方式均没解决,同事电脑和手机可搜索到我的WiFi。 二、问题: WiF驱动程序更新 三&#x…

覆盖路径生成算法STC(Spanning Tree Coverage)

STC 一种最基本的基于栅格地图的覆盖路径生成算法,代码地址。 以初始点为根节点最小生成树。将每个格子分成2x2小格子。先序遍历最小生成树(顺时针或者逆时针包围),可以画出包围整棵生成树的哈密顿路径。 覆盖分析 在网格地图…

谷歌Gemini AI模型使用指南

引言 2023年12月7日,谷歌宣布推出其迄今为止功能最强大、最通用的多模态人工智能(AI)大模型:Gemini。根据最新的性能评估,Gemini在多项指标上已经超越了ChatGPT 4。 Gemini的使用教程 Gemini 模型从大到小分为Ultra…

深度学习疫情社交安全距离检测算法 - python opencv cnn 计算机竞赛

文章目录 0 前言1 课题背景2 实现效果3 相关技术3.1 YOLOV43.2 基于 DeepSort 算法的行人跟踪 4 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习疫情社交安全距离检测算法 ** 该项目较为新颖,适合作为竞赛…

appium :输入框控件为android.view.View 时输入内容(如:验证码、密码输入框)

问题背景 输入密码的组件信息为&#xff1a;<android.view.View resource-id“com.qq.ac.android:id/pwd_input”> 由于输入框控件是android.view.View&#xff0c;不是android.widget.EditText&#xff0c;所以只能点击&#xff0c;而启动appium后&#xff0c;会将输入…

【c】杨辉三角

下面介绍两种方法 1.利用上面性质的第五条&#xff0c;我们可以求各行各列的组合数 2.利用上面性质的第7条&#xff0c;我们可以用数组完成 下面附上代码 1. #include<stdio.h> void fact(int n ,int m )//求组合数 {long long int sum11;long long int sum21;int a…

LeetCode二分查找:寻找旋转排序数组中的最小值

LeetCode二分查找&#xff1a;寻找旋转排序数组中的最小值 题目描述 已知一个长度为 n 的数组&#xff0c;预先按照升序排列&#xff0c;经由 1 到 n 次 旋转 后&#xff0c;得到输入数组。例如&#xff0c;原数组 nums [0,1,2,4,5,6,7] 在变化后可能得到&#xff1a; 若旋…