fastapi 传参以及参数校验
一、路径参数
FastAPI 支持使用 Python 字符串格式化语法什么路径参数(变量)
from fastapi import APIRouter, Body, Query, Path
import logginguser_router = APIRouter()@user_router.get("/{user_id}/{item_id}")
async def get_user(user_id: int = Path(..., gt=3),item_id: str = Path(..., min_length=3, max_length=10)
):logger.info(f"获取用户信息,用户ID:{user_id}, item_id: {item_id}")return {"status": 200, "message": "获取用户信息成功"}
这段代码把路径参数 user_id,item_id 的值传递给路径函数的参数 user_id,item_id
并使用 Path 对 user_id 和 item_id 的类型和值做了限制
- user_id 整数类型,值必须大于3
- item_id 字符串类型,长度大于等于3,小于等于10
二、查询参数
声明的参数不是路径参数时,路径操作函数会把该参数自动解释为查询参数。
from fastapi import APIRouter, Body, Query, Pathuser_router = APIRouter()
@user_router.get("/info")
async def get_user_info(username: str = Query(..., min_length=3, max_length=10),password: str = Query(..., min_length=6, max_length=20)
):logger.info(f"获取用户信息,用户名:{username}, 密码: {password}")return {"status": 200, "message": "获取用户信息成功"}
这段代码传递查询参数 username、password
并使用了 Query 对username、password 值类型和 长度做了限制
http://127.0.0.1:8000/user/info?username=jack&password=123456
针对查询参数较多且需要统一处理时,可以使用 BaseModel 来封装查询参数
class ItemQueryParams(BaseModel):q: Optional[str] = Field(None, min_length=3, max_length=10, regex=r"^[a-zA-Z0-9_-]{3,10}$")page: int = Field(1, ge=1),size: int = Field(10, ge=1, le=100)@validator("q")def validate_q(cls, v):if v and "ssm" in v:raise ValueError("q 不能包含敏感字 ssm")return v@user_router.get("/items")
async def get_items(params: ItemQueryParams = Depends()):logger.info(f"获取用户信息,参数:{params}")return {"status": 200, "message": "获取用户信息成功"}
这段代码,针对多参数时,可以借住 BaseModel 来进行多字段校验
http://127.0.0.1:8000/user/items?page=1&size=10&q=ssm
三、Form 表单参数接收验证
简单使用,并校验
from fastapi import APIRouter, Body, Query, Path, Depends, Form
import logging
from pydantic import BaseModel, Field, validator@user_router.post("/login")
async def login(username: str = Form(..., min_length=3, max_length=10),password: str = Form(..., min_length=6, max_length=20)
):logger.info("用户登录接口被调用")logger.warn("这是一个警告日志")return {"username": username, "password": password}
使用 BaseModel 进行校验
from fastapi import APIRouter, Body, Query, Path, Depends, Form
import logging
from pydantic import BaseModel, Field, validatorclass LoginForm(BaseModel):username: str = Field(..., min_length=3, max_length=10)password: str = Field(..., min_length=6, max_length=20)@validator("username")def validate_username(cls, v):if "ssm" in v:raise ValueError("用户名不能包含敏感字 ssm")return v@user_router.post("/login")
async def login(form: LoginForm = Depends(),
):logger.info("用户登录接口被调用")logger.warn("这是一个警告日志")return {"username": form.username, "password": form.password}
使用 pydantic 进行数据校验,可以针对某一个字段进行复杂校验
四、请求体传参
基于 Body 接受参数,但是只能针对参数做一些简单的验证
from fastapi import APIRouter, Body, Query, Path, Depends, Form
import logging
from pydantic import BaseModel, Field, validator@user_router.post("/login")
async def login(username: str = Body(..., min_length=3, max_length=10),password: str = Body(..., min_length=6, max_length=20),
):logger.info("用户登录接口被调用")logger.warn("这是一个警告日志")return {"username": username, "password": password}
基于 BaseModel 接受参数,并校验参数
class LoginForm(BaseModel):username: str = Field(..., min_length=3, max_length=10)password: str = Field(..., min_length=6, max_length=20)@validator("username")def validate_username(cls, v):if "ssm" in v:raise ValueError("用户名不能包含敏感字 ssm")return v@user_router.post("/login")
async def login(info: LoginForm,
):logger.info("用户登录接口被调用")logger.warn("这是一个警告日志")return {"username": info.username, "password": info.password}
可以针对 参数 做一些复杂的字段校验
五、文件上传
单文件上传
@user_router.post("/upload/")
async def upload_file(file: UploadFile = File(...)):return {"filename": file.filename,"content_type": file.content_type,"size": file.spool_max_size}
多文件上传
@app.post("/upload-multiple/")
async def upload_multiple_files(files: list[UploadFile] = File(...)):return {"filenames": [file.filename for file in files],"total_files": len(files)}