FastAPI之参数传递和参数校验

在这里插入图片描述


FastAPI之参数传递

  • 一、请求URL传参
    • 1、URL传参
    • 2、一个参数名,多个值
    • 3、参数校验
      • 3.1、默认值设置,和参数接口描述
      • 3.2、字符串长度校验
      • 3.3、正则表达式校验
      • 3.4、数值大小校验
  • 二、请求体传参
    • 1、请求体单个传参

一、请求URL传参

1、URL传参

url请求参数是通过url请求地址携带的,例如,在以下url中:

http://127.0.0.1:8000/items/?skip=0&limit=10

这些请求参数是键值对的集合,这些键值对位于 URL的 ? 之后,并以 &符号分隔。请求参数为:

skip :对应的值为 0
limit :对应的值为 10
当你为它们声明了 Python 类型(在上面的示例中为 int )时,它们将转换为该类型并针对该类型进行校验。

from typing import Unionfrom fastapi import APIRouter, Path, Querych2 = APIRouter(prefix="/ch2", tags=['URL传参'])@ch2.get('/emp', summary="搜索员工")
def find_all_emp(emp_id: int = Query(default=None, description="员工的id"),name: str = Query(default=None, description="员工的名字")):print(emp_id)print(name)return {"msg": "OK"}

URL请求参数不是路径的固定部分,因此它们可以是可选的,并且可以有默认值。
在上面的示例中,它们具有 skip=0 和 limit=10 的默认值。你可以将它们的默认值设置为 None 。

2、一个参数名,多个值

我们还可以使用 Query 去接收一组。使用 List[str]来接收一组值,里面的str可以根据需求随意调换。

from typing import Union, Listfrom fastapi import APIRouter, Path, Querych2 = APIRouter(prefix="/ch2", tags=['URL传参'])@ch2.delete('/emp', summary="搜索员工", description="只要传入多个员工id,就能删除多个员工")
def delete_emp(emp_ids: List[int] = Query(default=[], description="多个参数员工id")):print(emp_ids)return {"msg": "OK"}

在这里插入图片描述

3、参数校验

Query是FastAPI专门用来装饰URL请求参数的类,也可网易提供校验。

3.1、默认值设置,和参数接口描述

description是Query中的一个字段,用来描述该参数。

3.2、字符串长度校验

# 字符串长度校验
@ch2.post('/emp', summary="添加员工", description="需要员工的名字")
def delete_emp(name: str = Query(description="要添加的员工名字",max_length=15,min_length=3)):print(name)return {"msg": "OK"}

注意:max_length和min_length仅可用于str类型的参数

3.3、正则表达式校验

"""
1、用户名只能包含数字、字母、下划线
2、不能以数字开头
3、长度在6-16位之间
"""
@ch2.post('/emp', summary="添加员工", description="需要员工的名字")
def delete_emp(name: str = Query(description="要添加的员工名字",regex=r"^[a-zA-Z_]\w{5,15}$")):print(name)print(age)return {"msg": "OK"}

3.4、数值大小校验

如果参数的类型是int,float就可以采用Query进行大小校验,或者范围校验。

gt:大于
ge:大于等于
lt:小于
le:小于等于

"""
1、用户名只能包含数字、字母、下划线
2、不能以数字开头
3、长度在6-16位之间
"""
@ch2.post('/emp', summary="添加员工", description="需要员工的名字")
def delete_emp(name: str = Query(description="要添加的员工名字",regex=r"^[a-zA-Z_]\w{5,15}$"),age:int=Query(description="要添加的员工的年龄",ge=18,lt=60)):print(name)print(age)return {"msg": "OK"}

在这里插入图片描述

二、请求体传参

当你需要将数据从客户端(例如浏览器)发送给API时,你将其作为[请求体](request body)发送,请求体是客户端发送给API的数据,响应体是API发送给客户端的数据。

@field_validator(“name”) :自定义一个复杂的校验器,针对哪个字段做校验

from datetime import date
from typing import Union, Listfrom fastapi import APIRouter, Path, Query
from pydantic import BaseModel, Field, field_validatorch3 = APIRouter(prefix="/ch3", tags=['请求体传参'])class Address(BaseModel):"""详细地址"""provice: strcity: strcounty: strclass Emp(BaseModel):"""员工请求参数的模型类"""name: str = Field(description="员工的名字")age: int = Field(description="员工的年龄", ge=18, le=60)birth: date = Field(description="员工的出生日期", default=None)addr: Address = Field(default=None, description="员工的详细地址")@field_validator("name")  # todo 自定义一个复杂的校验器,针对哪个字段做校验def validate_name(cls, value):"""复杂的校验,校验员工名字:param value::return:"""import reresult = re.match(r"^[a-z_]\w{5,15}$", value)assert not result is Nonereturn value@ch3.post('/emp', summary="添加员工")
def add_emp(emp: Emp):print(emp)return emp

在这里插入图片描述
在这里插入图片描述

1、请求体单个传参

当请求体中的字段比较少时,没必要新建模型类字段;使用Body进行单个字段进行校验。

@ch3.post('/test', summary="测试添加员工")
def test_add_emp(name: str = Body(default=None, description="测试的姓名"),age: int = Body(default=18, description="测试的年龄")):print(name, age)return {"msg": "ok"}

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Vue Dom截图插件,截图转Base64 html2canvas

安装插件 npm install html2canvas --save插件使用 <template><div style"padding: 10px;"><div ref"imageTofile" class"box">发生什么事了</div><button click"toImage" style"margin: 10px;&quo…

C语言:深入了解指针3

1.回调函数是什么&#xff1f; 基本概念 回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另⼀个函数&#xff0c;当这个指针被⽤来调⽤其所指向的函数 时&#xff0c;被调⽤的函数就是回调函数。回调函数不是由该函…

llama.cpp GGUF 模型格式

llama.cpp GGUF 模型格式 1. Specification1.1. GGUF Naming Convention (命名规则)1.1.1. Validating Above Naming Convention 1.2. File Structure 2. Standardized key-value pairs2.1. General2.1.1. Required2.1.2. General metadata2.1.3. Source metadata 2.2. LLM2.2.…

【C++】STL——vector底层实现

目录 &#x1f495; 1.vector三个核心 &#x1f495;2.begin函数&#xff0c;end函数的实现&#xff08;简单略讲&#xff09; &#x1f495;3.size函数&#xff0c;capacity函数的实现 &#xff08;简单略讲&#xff09; &#x1f495;4.reserve函数实现 &#xff08;细节…

Pinia状态管理

1、为什么要使用Pinia&#xff1f; Pinia 是 Vue 的存储库&#xff0c;它允许跨组件/页面共享状态 Pinia 最初是为了探索 Vuex 的下一次迭代会是什么样子&#xff0c;结合了 Vuex 5 核心团队讨论中的许多想法。最终&#xff0c;我们意识到 Pinia 已经实现了我们在 Vuex 5 中想…

TCP | RFC793

注&#xff1a;本文为 “ RFC793” 相关文章合辑。 RFC793-TCP 中文翻译 编码那些事儿已于 2022-07-14 16:02:16 修改 简介 翻译自&#xff1a; RFC 793 - Transmission Control Protocol https://datatracker.ietf.org/doc/html/rfc793 TCP 是一个高可靠的主机到主机之间…

VMware Workstation Pro安装了Ubuntu 24.04实现与Windows10之间的复制粘贴

windows10安装了VMware Workstation Pro&#xff0c;虚拟机上安装Ubuntu 24.04&#xff0c;想Ubuntu和windows之间实现复制粘贴&#xff0c;便于互相执行下面命令&#xff1a; sudo apt-get autoremove open-vm-tools //卸载已有的工具 sudo apt-get install open-vm-tools …

idea分析sql性能

idea对sql进行解析&#xff0c;可有效展示sql的性能问题&#xff0c;比直接看命令好。&#xff08;专业版才有数据库功能&#xff0c;可以在淘宝买&#xff0c;10块就好了&#xff09; 如下&#xff1a; 发现一个全表扫描&#xff0c;耗时6s&#xff0c;对应sql语句可以查看&…

智慧园区系统集成解决方案提升管理效率与智能化水平的新探索

内容概要 随着科技的不断进步&#xff0c;智慧园区管理系统已成为现代园区管理的重要组成部分。在众多系统中&#xff0c;快鲸智慧园区(楼宇)管理系统凭借其独特的优势&#xff0c;获得了广泛关注。该系统通过全面整合园区内各类智能设备&#xff0c;大幅提升了管理效率和智能…

Linux 的 sysfs 伪文件系统介绍【用户可以通过文件操作与内核交互(如调用内核函数),而无需编写内核代码】

1. 什么是 sysfs伪文件系统&#xff1f; sysfs 是 Linux 内核提供的 伪文件系统&#xff0c;用于向用户空间暴露内核对象的信息和控制接口。它是 procfs 的补充&#xff0c;主要用于管理 设备、驱动、内核子系统 等信息&#xff0c;使用户可以通过文件操作&#xff08;如用户空…

TCP编程

1.socket函数 int socket(int domain, int type, int protocol); 头文件&#xff1a;include<sys/types.h>&#xff0c;include<sys/socket.h> 参数 int domain AF_INET: IPv4 Internet protocols AF_INET6: IPv6 Internet protocols AF_UNIX, AF_LOCAL : Local…

springboot+vue+uniapp的校园二手交易小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

【PyQt】使用PyQt5和Matplotlib实现的CSV数据可视化工具

使用PyQt5和Matplotlib实现的CSV数据可视化工具 界面展示 代码 import sys from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout,QHBoxLayout, QPushButton, QComboBox, QFileDialog,QLabel, QMessageBox) import pandas as pd from matplotlib.f…

软件工程导论三级项目报告--《软件工程》课程网站

《软件工程》课程网站 摘要 本文详细介绍了《软件工程》课程网站的设计与实现方案&#xff0c;包括可行性分析、需求分析、总体设计、详细设计、测试用例。首先&#xff0c;通过可行性分析从各方面确认了该工程的可实现性&#xff0c;接着需求分析明确了系统的目标用户群和功能…

数据结构-堆和PriorityQueue

1.堆&#xff08;Heap&#xff09; 1.1堆的概念 堆是一种非常重要的数据结构&#xff0c;通常被实现为一种特殊的完全二叉树 如果有一个关键码的集合K{k0,k1,k2,...,kn-1}&#xff0c;把它所有的元素按照完全二叉树的顺序存储在一个一维数组中&#xff0c;如果满足ki<k2i…

Spring @Lazy:延迟初始化,为应用减负

在Spring框架中&#xff0c;Lazy注解的作用非常直观&#xff0c;它就是用来告诉Spring容器&#xff1a;“嘿&#xff0c;这个Bean嘛&#xff0c;先别急着创建和初始化&#xff0c;等到真正需要用到的时候再弄吧&#xff01;” 默认情况下&#xff0c;Spring容器在启动时会立即创…

SynchronousQueue 与 LinkedBlockingQueue区别及应用场景

文章目录 前言认识SynchronousQueue基本对比及比较1. **基本特性**2. **内部实现**3. **性能特点**4. **使用场景**5. **总结对比** SynchronousQueue案例JDK应用案例案例1&#xff1a;SynchronousQueue的简单用例案例2&#xff1a;SynchronousQueue公平锁、非公平锁案例案例3&…

MySQL 缓存机制与架构解析

目录 一、MySQL缓存机制概述 二、MySQL整体架构 三、SQL查询执行全流程 四、MySQL 8.0为何移除查询缓存&#xff1f; 五、MySQL 8.0前的查询缓存配置 六、替代方案&#xff1a;应用层缓存与优化建议 总结 一、MySQL缓存机制概述 MySQL的缓存机制旨在提升数据访问效率&am…

【C++】STL——list的使用

目录 &#x1f495;1.带头双向链表List &#x1f495;2.list用法介绍 &#x1f495;3.list的初始化 &#x1f495;4.size函数与resize函数 &#x1f495;5.empty函数 &#x1f495;6.front函数与back函数 &#x1f495;7.push_front,push_back,pop_front,pop_back函数…

MySQL知识点总结(一)

1.SQL分类 数据定义&#xff08;DDL&#xff09;:创/改/删/名/清&#xff08;cadrt&#xff09; 数据库对象&#xff1a;表/视图/存储/函数/触发器/事件 数据操作&#xff08;DML&#xff09;&#xff1a;增/删/改/查&#xff08;idus&#xff09; 操作数据库对象 数据控制&…