侧边栏壁纸
  • 累计撰写 84 篇文章
  • 累计创建 82 个标签
  • 累计收到 117 条评论

目 录CONTENT

文章目录

FastAPI从入门到实战(5)——查询参数与字符串校验

MinChess
2022-11-27 / 0 评论 / 1 点赞 / 948 阅读 / 1,205 字 / 正在检测是否收录...

本文主要记录查询参数的传递、特性以及字符串类型的数据校验相关内容

查询参数

@app02.get("/stu02/query")
def stu02_query(query: float = 0.01):
    return {"query":query}

声明不属于路径参数的其他函数参数时,它自动解释为"查询字符串"参数

image-20221125111609466

可选参数

@app02.get("/stu02/query/select")
def stu02_query_select(string: Optional[float] = None,number:int = 1,optionalfloat:float = 6.33):
    return {"String":string,"Number":number,"optionalfloat":optionalfloat}

声明参数的时候给定默认值,即会解析为选填的参数

image-20221125111735046

类型转换

@app02.get("/stu02/query/bool")
def stu02_type_conversion(
        query:bool = False
):
    return {"布尔值":query}

该请求FastAPI会自动将传递的参数转为bool类型,当不能够转换的时候将会抛出错误;

能转换的如:false、FALSE、0、YES、off

{
    "detail": [
        {
            "loc": [
                "query",
                "query"
            ],
            "msg": "value could not be parsed to a boolean",
            "type": "type_error.bool"
        }
    ]
}
{
    "布尔值": false
}
{
    "布尔值": true
}
{
    "布尔值": true
}

使用Query默认值

声明Query即可使用FastAPIQuery进行数据的校验以及使用更多的元数据;

@app02.get("/stu02/query/default")
def stu02_query_QueryDefault(param:str = Query(default="QueryDefault")):
    return {"DefaultQuery":param}

设置参数default="默认参数"即可设置默认值

image-20221125114018006

使用Query进行校验

@app02.get("/stu02/query/validate")
def stu02_query_QueryValidate(
        param:str = Query(default= None,min_length=2,max_length=10,regex="^M")
):
    return {"param":param}

设置对应的参数即可进行校验,如上面的代码就是校验其最小长度为2,最大为10,而且利用正则表达式限定必须为M开头

image-20221125114300454

image-20221125114319627

  • 更多参数可以直接看源码:
def Query(  # noqa: N802
    default: Any = Undefined,
    *,
    alias: Optional[str] = None, # 元数据 别名
    title: Optional[str] = None, # 元数据 标题
    description: Optional[str] = None, # 元数据 描述
    gt: Optional[float] = None, # 数值校验
    ge: Optional[float] = None,
    lt: Optional[float] = None,
    le: Optional[float] = None,
    min_length: Optional[int] = None,
    max_length: Optional[int] = None,
    regex: Optional[str] = None,
    example: Any = Undefined,
    examples: Optional[Dict[str, Any]] = None,
    deprecated: Optional[bool] = None,
    include_in_schema: bool = True,
    **extra: Any,
)

传递列表

@app02.get("/stu02/query/querylist")
def stu02_query_QueryList(
        param_list: List[str] = Query(default=["List_01", "List_02", "List_03"], alias="参数别名")
):
    return {"param_list":param_list}

该示例即请求会传递一个列表的参数,FastAPI接收并返回。

image-20221125115033359

声明必需参数

在大多数情况下,需要某些东西时,可以简单地省略 default 参数,因此你通常不必使用 ...Required

@app02.get("/stu02/query/querymust")
def stu02_query_QueryMust(
        param:str,
        param_None: Optional[str] = Query(default=...), # 使其可以接受None
        param_Pydantic:str = Query(default=Required)
):
    return {"param":param,"param_None":param_None,"param_Pydantic":param_Pydantic}

上面三个参数都是必需的参数;

param参数没有默认值,就被解析为必需参数;

param_None参数利用Optional声明为可选的参数,再使用Query的...声明为必需参数;

param_Pydantic参数利用Query的default参数设置为Required声明为必需的参数;

Required一个Pydantic内的任意类型的内置常量,源码:Required: Any = Ellipsis

image-20221125115643456

源码

# -*- coding: utf-8 -*-
# @Time: 2022/11/24 21:40
# @Author: MinChess
# @File: stu02.py
# @Software: PyCharm

from fastapi import APIRouter,Query
from typing import Optional,List

from pydantic import Required

app02 = APIRouter()

# 查询参数
@app02.get("/stu02/query")
def stu02_query(query: float = 0.01):
    return {"query":query}

# 可选参数
@app02.get("/stu02/query/select")
def stu02_query_select(string: Optional[float] = None,number:int = 1,optionalfloat:float = 6.33):
    return {"String":string,"Number":number,"optionalfloat":optionalfloat}

# 类型转换
@app02.get("/stu02/query/bool")
def stu02_type_conversion(
        query:bool = False
):
    return {"布尔值":query}

# 使用Query默认值
@app02.get("/stu02/query/default")
def stu02_query_QueryDefault(param:str = Query(default="QueryDefault")):
    return {"DefaultQuery":param}

# 使用Query进行校验
@app02.get("/stu02/query/validate")
def stu02_query_QueryValidate(
        param:str = Query(default= None,min_length=2,max_length=10,regex="^M")
):
    return {"param":param}

# 传递列表
@app02.get("/stu02/query/querylist")
def stu02_query_QueryList(
        param_list: List[str] = Query(default=["List_01", "List_02", "List_03"], alias="参数别名")
):
    return {"param_list":param_list}

# 声明必需参数
@app02.get("/stu02/query/querymust")
def stu02_query_QueryMust(
        param:str,
        param_None: Optional[str] = Query(default=...), # 使其可以接受None
        param_Pydantic:str = Query(default=Required)
):
    return {"param":param,"param_None":param_None,"param_Pydantic":param_Pydantic}
# 在大多数情况下,需要某些东西时,可以简单地省略 default 参数,因此你通常不必使用 ... 或 Required
# Required: Any = Ellipsis 就是一个任意类型的内置常量
1

评论区