FastAPI查询参数和字符串校验

news2025/1/18 11:47:50

在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 Union

from fastapi import FastAPI, Query

app = 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.coloradmin.cn/o/1293780.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【已解决】ImportError: cannot import name ‘Merge‘ from ‘keras.layers‘

问题描述 ImportError: cannot import name ‘Merge‘ from ‘keras.layers‘ 解决办法 1、tensorflow和keras版本要对应; 2、使用"merge" pip uninstall keras pip install keras2.3.1 from keras.layers import merge完结撒花 我这血中带泪的成长&…

从传统到胜利:广汽集团汽车产业创新之旅

置身于汽车行业百年未有之大变局,作为传统车企中的排头兵,广汽创新可圈可点,广汽近年来取得了骄人业绩,不论是整体产销规模,还是新能源汽车产业化、新技术领域开拓等,都呈现节节攀升的局面。本文奖从产业变…

2024年值得关注的8个未来数据库

2024年值得关注的8个未来数据库 关系型数据库管理系统在数据库技术领域占据主导地位已经多年了。当SQL在1970年代首次出现时,关系型数据库管理系统的使用和受欢迎程度迅速提升。很快,MySQL成为了大多数公司和团队首选的数据库。 然而,2023年…

时间序列预测实战(二十六)PyTorch实现Seq2Seq(LSTM)(结果可视化+自动保存结果)

一、本文介绍 本文给大家带来的时间序列模型是Seq2Seq,这个概念相信大家都不陌生了,网上的讲解已经满天飞了,但是本文给大家带来的是我在Seq2Seq思想上开发的一个模型和新的架构,其是专门为新手开发的,而且为了方便大…

上海亚商投顾:沪指探底回升微跌 AI概念股全线反弹

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 大指数早间震荡调整,午后探底回升集体翻红,临近尾盘又小幅走弱。AI概念股全线反弹&…

pytorch优化之SAM优化器

1. SAM介绍 人机验证 2. 案例 ❀精度优化❀优化策略1:网络SAM优化器_夏天|여름이다的博客-CSDN博客文章浏览阅读3.3k次,点赞10次,收藏30次。精度优化策略:SAM:Sharpness AwarenessMinimization锐度感知最小化论文&…

【CCF CSP】202309-2 坐标变换(其二)

80分超时暴力代码&#xff1a;读入数据&#xff0c;对于每个待操作坐标都重新对于所给区间进行平移&#xff0c;旋转的坐标变换 #include <iostream> #include <cmath>using namespace std;struct mani {int type;double num; }; mani all[100001];int main() {in…

在VSCode中运行Python脚本文件时如何传参

以下实验所处的操作系统环境说明&#xff1a; OS版本MacOSMonterey 12.1VSCodeOctober 2023 (version 1.84.2) 一、背景 在 VSCode 中写好 Python 脚本后&#xff0c;如果要运行起来&#xff0c;可以怎么做呢&#xff1f; 一般有以下几种方式&#xff1a; 1、直接在 VSCode…

简单使用selenium抓取微博热搜话题存储进Excel表格中

#test.pyimport requests from selenium import webdriver import time from write import write#首先打开浏览器 drive webdriver.Chrome()#设置隐式等待&#xff1a;等待元素找到&#xff0c;如果找到元素则马上继续执行语句&#xff0c;如果找不到元素&#xff0c;会在设定…

【性能测试】性能测试之性能测试指标详解(详细)

前言 刚开始&#xff0c;以为做性能测试&#xff0c;就是做些脚本、参数化、关联&#xff0c;压起来之后&#xff0c;再扔出一个结果。 但实际上不止这些内容&#xff0c;还要加上性能分析&#xff0c;关注调优之后响应时间有多大的提升&#xff0c;TPS 有多大的提高&#xf…

探索 HTML 语义化:让你的网页更有意义(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

【链表Linked List】力扣-117 填充每个节点的下一个右侧节点指针II

目录 问题描述 解题过程 官方题解 问题描述 给定一个二叉树&#xff1a; struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针&#xff0c;让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点&#xff0c;则将 next 指针设置为 N…

ELK(三)—安装可视化工具

目录复制 目录 一、ElasticSearch-Head可视化工具介绍1.1特性&#xff1a;1.2用法&#xff1a; 二、安装2.1docker安装2.2Chrome插件安装 一、ElasticSearch-Head可视化工具介绍 ElasticSearch-Head 是一个基于浏览器的 Elasticsearch 可视化工具&#xff0c;它提供了一个直观…

Linux中的网络时间服务器

本章主要介绍网络时间的服务器 使用chrony配置时间服务器配置chrony客户端服务器同步时间 1.1 时间同步的重要性 一些服务对时间要求非常严格&#xff0c;例如如图所示的由三台服务器搭建的ceph集群 这三台服务器的时间必须保持一致&#xff0c;如果不一致&#xff0c;就会显…

随机Numpy数组的创建方法(第2讲)

随机Numpy数组的创建方法 &#xff08;第2讲&#xff09;         &#x1f379;博主 侯小啾 感谢您的支持与信赖。☀️ &#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&…

python socket编程6 - 使用PyQt6 开发UI界面实现TCP server和TCP client单机通讯的例子

使用PyQt6 开发UI界面实现TCP server和TCP client单机通讯的示例。 一、PyQt6 实现的界面 二、TCP server代码的修改示意 界面提供网络参数的配置&#xff0c;以及提供人机交互过程中的数据获取和显示。 1、把上面的server代码封装成两个部分 A、class Server 负责接受UI界面…

6.1 U-boot的使用

由于Ubuntu出现了一些问题&#xff0c;后面都是使用正点原子官方版本。 一、U-boot使用 1. U-boot源码 Linux 系统要启动需要通过 bootloader 程序引导&#xff0c;也就说芯片上电以后先运行一段 bootloader 程序。这段 bootloader 程序会先初始化 DDR 等外设&#xff0c;然后…

Redis生产实战-Redis集群故障探测以及降级方案设计

Redis 集群故障探测 在生产环境中&#xff0c;如果 Redis 集群崩溃了&#xff0c;那么会导致大量的请求打到数据库中&#xff0c;会导致整个系统都崩溃&#xff0c;所以系统需要可以识别缓存故障&#xff0c;限流保护数据库&#xff0c;并且启动接口的降级机制 降级方案设计 …

【c】小红的漂亮串

#include<stdio.h> #include<string.h> int main() {char arr[1000];int count0;gets(arr);//在数组中输入字符串int lenstrlen(arr);//求字符串长度printf("%d\n",len);for(int i0;i<len;i){if(arr[i]r){if(arr[i1]e){if(arr[i2]d){countcount1;}}}}…

C#winform上下班打卡系统Demo

C# winform上下班打卡系统Demo 系统效果如图所示 7个label控件(lblUsername、lblLoggedInEmployeeId、lab_IP、lblCheckOutTime、lblCheckInTime、lab_starttime、lab_endtime)、3个按钮、1个dataGridView控件、2个groupBox控件 C#代码实现 using System; using System.Dat…