当前位置: 首页 > news >正文

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)}
http://www.lryc.cn/news/598104.html

相关文章:

  • HTML应用指南:利用GET请求获取全国奈雪的茶门店位置信息
  • 鸿蒙平台运行Lua脚本
  • 自己动手造轮子:如何创建JAR并通过Maven在Spring Boot中引用
  • Python进阶第三方库之Matplotlib
  • 同花顺前端潜在面试题目与答案
  • [iOS开发工具] 【iOS14以及以下】cydia商店按键精灵iOS新版V2.X安装教程
  • 数据库垂直拆分和水平拆分
  • Kafka入门指南:从零开始掌握分布式消息队列
  • 【医疗行业】DICOM
  • Spring Boot 请求参数绑定:全面解析常用注解及最佳实践
  • PHP文件下载
  • Edwards爱德华泵软件 支持nEXT85和nXDS系列泵,包括nXRi, nRVi和nXLi增强型 nEXT nXDS nXLi
  • 二分查找----4.搜索旋转排序数组
  • 【STM32】FreeRTOS 任务的删除(三)
  • 力扣面试150题--在排序数组中查找元素的第一个和最后一个位置
  • C++ - 仿 RabbitMQ 实现消息队列--服务端核心模块实现(三)
  • MapStruct类型转换接口未自动注入到spring容器中
  • 点击按钮滚动到底功能vue的v-on:scroll运用
  • 大模型微调学习笔记(基于讯飞星辰MaaS速学版)
  • Hive常用函数
  • CSDN技术专栏开篇:高效开发环境搭建指南
  • 重构数据库未来:金仓数据库,抢占 AI 原生时代先机
  • 基础NLP | 01 机器学习 深度学习基础介绍
  • uni-appDay02
  • uniapp中flex布局gap属性兼容处理
  • LockPatternUtils中比较重要的方法
  • day46.通道注意力
  • 【SpringAI实战】FunctionCalling实现企业级自定义智能客服
  • Quarkus利用 MicroProfile 实现微服务特性
  • 基于深度学习的图像分类:使用EfficientNet实现高效分类