FastAPI之参数传递和参数校验

在这里插入图片描述


一、请求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 Union

from fastapi import APIRouter, Path, Query

ch2 = 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, List

from fastapi import APIRouter, Path, Query

ch2 = 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, List

from fastapi import APIRouter, Path, Query
from pydantic import BaseModel, Field, field_validator

ch3 = APIRouter(prefix="/ch3", tags=['请求体传参'])


class Address(BaseModel):
    """
    详细地址
    """
    provice: str
    city: str
    county: str


class 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 re
        result = re.match(r"^[a-z_]\w{5,15}$", value)
        assert not result is None
        return 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"}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码敲到头发茂密

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值