Python框架篇(2):FastApi-参数接收和验证

 @提示: 如果想获取文章中具体的代码信息,可在微信搜索【猿码记】回复 【fastapi】即可。

1.参数接收

1.1 路径参数(不推荐)

1.代码清单

app/router下,新增demo_router.py文件,内容如下:

from fastapi import APIRouter

router = APIRouter(
    prefix="/demo",
    tags=["演示接口"]
)

@router.get("/path/{order_id}")
async def pathParamReceive(order_id: int):
    """
    路径参数接收演示
    """

    return {
        "接受结果": order_id,
    }

@注意:当我们定义参数类型时,FastAPI 接受参数时,会自动进行"解析",如果类型不一致,则会报错。

2.请求验证
# 正常传参
➜  curl http://127.0.0.1:8000/demo/path/12222
{"接受结果":12222}
# 当传参类型不匹配时,接口定义是:int
➜  curl http://127.0.0.1:8000/demo/path/hello
{"detail":[{"loc":["path","order_id"],"msg":"value is not a valid integer","type":"type_error.integer"}]}
# 当什么都不传时
➜ curl http://127.0.0.1:8000/demo/path/
{"detail":"Not Found"}
3.顺序大坑

假如我们定义两个接口,带路径参数的:/path/{order_id}和不带路径参数的:/path/test,可能会因为顺序问题,导致我们无法正常访问/path/test,例如路由注册时代码如下:

...
@router.get("/path/{order_id}")
async def pathParamReceive(order_id: int):
    """
    路径参数接收-演示-带路径参数
    """

    return {
        "接受结果": order_id,
    }


@router.get("/path/test")
async def pathParamReceive2():
    """
    路径参数接收-演示-不带路径参数
    """

    return {
        "msg""hello",
    }

然后进行访问:

# 带路径参数的可以正常访问
➜  curl http://127.0.0.1:8000/demo/path/99999
{"接受结果":99999}
# 不带路径参数的可以正常访问
➜ curl http://127.0.0.1:8000/demo/path/test
{"detail":[{"loc":["path","order_id"],"msg":"value is not a valid integer","type":"type_error.integer"}]}

通过替换两个函数位置,就可以正常访问了, 感觉比较奇葩,不推荐使用,只做了解即可。更多使用方法可见官方文档: https://fastapi.tiangolo.com/zh/tutorial/path-params/

1.2 查询参数

1.代码清单

app/router下,新增demo_router.py文件,内容如下:

from typing import Union
...
@router.get("/query/receive")
@router.get("/query/receive")
async def queryParamReceive(username: str, sex: str = '男', city: Union[str, None] = None):
    """
    查询参数接受-演示
    """

    return {
        "msg""查询参数接收",
        "result": {
            "username": username,
            "sex": sex,
            "city": city,
        }
    }
...    
2.参数约束
  • username: str: 代表参数 username为必填字段;
  • sex: str = '男': 代表参数 sex为选填字段,并且有默认值 ;
  • city: Union[str, None] = None: 代表参数 city为选填字段, 并无默认值; Uniontyping 模块中的一个泛型类,用于表示多个类型中的一个;

@注意: 当参数有默认值时,顺序一定要放在没有默认值参数后面,否则会提示语法错误:SyntaxError: non-default argument follows default argument

3.请求验证
alt

1.3 请求体(推荐)

使用请求体接受参数,一般分为两个步骤:

  • 第一步: 使用 Pydantic模型声明一个请求体(其实就是 class);
  • 第二步: 路由函数的参数绑定上这个模型;

@注意:工作中比较常用的参数接收方式,推荐使用~

1.定义模型

文件位置: app/parameter/demo_param.py

from typing import Union
# 导入pydantic对应的模型基类
from pydantic import BaseModel

class DemoParam(BaseModel):
    """
    请求体参数对应的模型
    """

    user_name: str
    age: int
    city: Union[str, None]
2.优化导入

文件位置: app/parameter/__init__.py

from app.parameter.demo_param import DemoParam
3.使用

文件位置: app/router/demo_router.py

# from app.parameter.demo_param import DemoParam 如果没有优化导入,需要用这种方式导入
from app.parameter import DemoParam # 如果没有优化导入,这行会报错

router = APIRouter(
    prefix="/demo",
    tags=["演示接口"]
)


@router.post("/query/receive")
async def bodyReceive(body: DemoParam):
    """
    请求体参数接受-演示
    """

    return {
        "msg""请求体参数接受",
        "result": {
            "body": body,
        }
    }
4.验证
# 必填参数user_name,不传时
curl -X 'POST' \
  'http://127.0.0.1:8000/demo/query/body/receive' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "age": 99,
  "city": "北京"
}'


{"detail":[{"loc":["body","user_name"],"msg":"field required","type":"value_error.missing"}]}


# 必填参数user_name,传值时
➜ curl -X 'POST' \
  'http://127.0.0.1:8000/demo/query/body/receive' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "user_name": "娃哈哈",
  "age": 99,
  "city": "北京"
}'

{"msg":"请求体参数接受","result":{"body":{"user_name":"娃哈哈","age":99,"city":"北京"}}}

# 必填参数user_name,传空时
➜  curl -X 'POST' \
  'http://127.0.0.1:8000/demo/query/body/receive' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "user_name": "",
  "age": 99,
  "city": "北京"
}'

{"msg":"请求体参数接受","result":{"body":{"user_name":"","age":99,"city":"北京"}}}

2.参数验证

Python中推荐使用成熟的第三方库进行数据验证,这样不仅可以少写一些if .. elif..,还能让代码的可读性更强;

2.1 Pydantic介绍

Pydantic 是一个 Python 库,用于数据验证和设置,特别是用于验证数据模型。它通过声明性的方式定义数据模型,并提供了强大的数据验证和转换功能。Pydantic 最初是为 FastAPI 框架设计的,但它也可以在其他 Python 项目中独立使用。

@注意: 文中使用的pydantic版本为: 1.10.11, 貌似不同的版本,可能会存在差异;具体可参见官方文档: https://docs.pydantic.dev/latest/

使用Pydantic 的本质,其实就是如何编写对应的数据验证规则,下面列举一些常用的规则:

2.2 常用验证

下面列举一些常用的验证规则:

  • 基本数据类型: int, float, str, bool;
  • 可选参数: Optional[type] 表示可选参数, Union[x, None]也可以表示可选;
  • 整数范围: 结合 conint函数判断数字范围 ,如 age: conint(ge=18, le=30); ge:大于等于、gt:大于、le:小于等于、lt:小于
  • 字符长度: 结合 constr函数判断字符长度,如: constr(min_length=6, max_length=10);
  • 正则表达式: 使用 constr函数中的参数 regex ,可以用于进行正则表达式验证;
  • 枚举验证: 使用 Enum 定义枚举类,验证。
  • 列表类型: 使用 List[type] 来限制列表值的类型,并尝试把参数转成对应的类型。
  • 字典类型: Dict[key_type, value_type] 来限制字典 keyval类型,并尝试把参数转成对应的类型。
from enum import Enum
from typing import Union, Optional, List, Dict

# 导入pydantic对应的模型基类
from pydantic import BaseModel, constr, conint


class GenderEnum(str, Enum):
    """
    性别枚举
    """

    male = "男"
    female = "女"


class PydanticVerifyParam(BaseModel):
    """
    用来学习使用pydantic模型验证
    """

    user_name: str  # 基本类型
    age: conint(ge=18, le=30)  # 整数范围:18 <= age <= 30
    password: constr(min_length=6, max_length=10)  # 字符长度
    phone: constr(regex=r'^1\d{10}$')  # 正则验证手机号
    address: Optional[str] = None  # 可选参数
    sex: GenderEnum  # 枚举验证,只能传: 男和女
    likes: List[str]  # 值会自动转成传字符串列表
    scores: Dict[str, float]  # key会转成字符串,val 会转成浮点型

@注意:上面列举的都是基本使用,实际中可以组合进行多项组合使用,如items: List[constr(min_length=1, max_length=3)] : 限制列表中的每个字符串长度的范围

2.3 自定义验证

@validator 装饰器用于定义自定义验证函数,具体是如下:

from pydantic import BaseModel, constr, conint, validator
...
class PydanticVerifyParam(BaseModel):
    """
    用来学习使用pydantic模型验证
    """

    user_name: str  # 基本类型
    ...
    @validator("user_name")
    def validateUsername(cls, value: str):
        """
        自定义验证函数
        """

        if value.find("傻") > -1:
            raise ValueError("user_name不能包含敏感词")
        return value      

验证结果:

// 当参数user_name传:你好傻
{
  "detail": [
    {
      "loc": [
        "body",
        "user_name"
      ],
      "msg""user_name不能包含敏感词",
      "type""value_error"
    }
  ]
}

2.4 其他验证

  • EmailStr: 用于验证字符串是否是有效的电子邮件地址。
  • IPvAnyAddress: 用于验证字符串是否是有效的 IPv4 或 IPv6 地址。
  • StrictBool: 用于验证字符串是否是严格的布尔值( truefalse)。
  • AnyHttpUrl: 用于验证字符串是否是有效的 URL,包括以 httphttps 开头的 URL

更多验证方式可查看文档: https://docs.pydantic.dev/latest/concepts/validators/

本文由 mdnice 多平台发布

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

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

相关文章

SpringCloud微服务:Nacos的集群、负载均衡、环境隔离

目录 集群 在user-service的yml文件配置集群 启动服务 负载均衡 order-service配置集群 设置负载均衡 当本地集群的服务挂掉时 访问权重 环境隔离 1、Nacos服务分级存储模型 一级是服务&#xff0c;例如userservice 二级是集群&#xff0c;例如杭州或上海 …

【自动化测试】基于Selenium + Python的web自动化框架!

一、什么是Selenium&#xff1f; Selenium是一个基于浏览器的自动化工具&#xff0c;她提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。Selenium主要包括三部分&#xff1a;Selenium IDE、Selenium WebDriver 和Selenium Grid&#xff1a;  1、Selenium IDE&…

设计基于STM32F103C8T6微控制器的巡线小车

巡线小车是一种能够在一条预定线追踪路径的小车&#xff0c;广泛应用于工业自动化、物流仓储、智能家居等领域。本设计将使用STM32F103C8T6微控制器来实现一个基础的巡线小车。 硬件组成&#xff1a;1. STM32F103C8T6微控制器开发板&#xff1a;作为巡线小车的核心控制器&…

开源与闭源:数字化时代的辩论与未来走向

在当今的数字化时代&#xff0c;关于开源和闭源软件的辩论一直是技术界的热门话题。 特斯拉CEO马斯克最近也加入了这场辩论&#xff0c;公开表示OpenAI不应该闭源&#xff0c;而他自己的首款聊天机器人将选择开源。 这引发了人们对开源与闭源软件的进一步思考&#xff1a;开源是…

关于数据mysql ->maxwell->kafka的数据传输

个人名片&#xff1a; &#x1f405;作者简介&#xff1a;一名大三在校生&#xff0c;热爱生活&#xff0c;爱好敲码&#xff01; \ &#x1f485;个人主页 &#x1f947;&#xff1a;holy-wangle ➡系列内容&#xff1a; &#x1f5bc;️ tkinter前端窗口界面创建与优化 &…

基于ssm+vue员工工资管理系统

基于ssmvue员工工资管理系统 摘要 随着信息技术的不断发展&#xff0c;各行各业对于高效管理和利用数据的需求也日益增长。员工工资管理系统作为企业管理中的一个重要组成部分&#xff0c;对于实现工资信息的精确计算、及时发放和有效管理具有重要意义。本文基于SSM&#xff08…

asp.net core EF Sqlserver

一、EF CORE的使用 1、使用NuGet来安装EF CORE 使用程序包管理器控制台&#xff0c;进行命令安装 //安装 Microsoft.EntityFrameworkCoreInstall-Package Microsoft.EntityFrameworkCore //安装 Microsoft.EntityFrameworkCore.SqlServer Install-Package Microsoft.EntityF…

c#之反射详解

总目录 文章目录 总目录一、反射是什么&#xff1f;1、C#编译运行过程2、反射与元数据3、反射的优缺点 二、反射的使用1、反射相关的类和命名空间1、System.Type类的应用2、System.Activator类的应用3、System.Reflection.Assembly类的应用4、System.Reflection.Module类的应用…

demo(二)eurekaribbon----服务注册、提供与消费

前一篇实现了服务注册中心的搭建&#xff0c;并提供服务注册到注册中心上。在之前的基础上&#xff0c;实现服务消费。 一、相关介绍 1、RestTemplate工具 2、LoadBalanced注解&#xff1a;开启客户端负载均衡 二、ribbon示例&#xff1a; 先启动eureka-service注册中心&a…

rabbitMQ的Topic模式的生产者与消费者使用案例

topic模式 RoutingKey 按照英文单词点号多拼接规则填充。其中消费者匹配规则时候 * 代表一个单词&#xff0c;#表示多个单词 消费者C1的RoutingKey 规则按照*.orange.* 匹配 绑定队列Q1 package com.esint.rabbitmq.work05;import com.esint.rabbitmq.RabbitMQUtils; import …

【Python基础篇】运算符

博主&#xff1a;&#x1f44d;不许代码码上红 欢迎&#xff1a;&#x1f40b;点赞、收藏、关注、评论。 格言&#xff1a; 大鹏一日同风起&#xff0c;扶摇直上九万里。 文章目录 一 Python中的运算符二 算术运算符1 Python所有算术运算符的说明2 Python算术运算符的所有操作…

ubuntu20.04.6安装Intel AX211网卡驱动

前言 环境&#xff1a; ThinkBook16 2023 款网卡Intel AX211 Wi-Fi6ubuntu版本20.04.6&#xff08;最后一位小数很重要&#xff09;系统内核 Linux wzy 5.15.0-67-generic #74~20.04.1-Ubuntu SMP Wed Feb 22 14:52:34 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux 方法&#x…

leetcode:476. 数字的补数

一、题目 476. 数字的补数 - 力扣&#xff08;LeetCode&#xff09; 函数原型&#xff1a; int findComplement(int num) 二、思路 将num的每一位取出来&#xff0c;取反后&#xff0c;乘以2的位次方&#xff0c;最终所有结果相加即可得到结果。 如何取出num的每一位&#xff1…

Unity Quaternion接口API的常用方法解析_unity基础开发教程

Quaternion接口的常用方法 Quaternion.Euler()Quaternion.Lerp()Quaternion.Inverse()Quaternion.RotateTowards() Quaternion在Unity中是一种非常重要的数据类型&#xff0c;用于表示3D空间中的旋转。Quaternion可以表示任何旋转&#xff0c;无论是在哪个轴上旋转多少度&#…

【OpenCV实现图像:OpenCV进行OCR字符分割】

文章目录 概要基本概念读入图像图像二值化小结 概要 在处理OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;时&#xff0c;利用传统的图像处理方法进行字符切分仍然是一种有效的途径。即便当前计算机视觉领域主导的是卷积神经网络&#xf…

Tomcat web.xml文件中的mime-mapping

在Tomcat安装目录的conf/web.xml文件中&#xff0c;定义了大量的<mime-mapping>元素&#xff0c;例如&#xff1a; 其中<extension>指定了文件的扩展名&#xff0c;<mime-type>指定了mime类型&#xff0c;放在<mime-mapping>元素中&#xff0c;就是将…

Spring Boot使用EhCache完成一个缓存集群

在上一篇在SpringBoot中使用EhCache缓存&#xff0c;我们完成了在Spring Boot中完成了对EhCaChe的使用&#xff0c;这篇&#xff0c;我们将对EhCache的进一步了解&#xff0c;也就是搭建一个EhCache的缓存集群。 集群 在搭建一个EhCache的时候&#xff0c;我们需要先了解&…

qt笔记之qml和C++的交互系列(一):初记

code review! —— 杭州 2023-11-16 夜 文章目录 一.qt笔记之qml和C的交互&#xff1a;官方文档阅读理解0.《Overview - QML and C Integration》中给出五种QML与C集成的方法1.Q_PROPERTY&#xff1a;将C类的成员变量暴露给QML2.Q_INVOKABLE()或public slots&#xff1a;将C类…

【python】均值、中值和高斯滤波详解和示例

本文对均值、中值和高斯滤波进行详解&#xff0c;以帮助大家理解和使用。 这里写目录标题 均值滤波中值滤波高斯滤波核大小为&#xff08;9,9&#xff09;核大小为&#xff08;51,51&#xff09; 小结 下面是示例中使用的原图。 均值滤波 均值滤波是一种简单的平滑滤波器&…

nodejs+vue教室管理系统的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计

用户 用户管理&#xff1a;查看&#xff0c;修改自己的个人信息 教室预约&#xff1a;可以预约今天明天的教室&#xff0c;按着时间段预约&#xff08;可多选&#xff09;&#xff0c;如果当前时间超过预约时间段不能预约该时间段的教室 预约教室的时候要有个预约用途&#xff…