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"}