FastApi_02_请求方式与常见参数类型
FastAPI 支持标准的 HTTP 请求方法,用于指示对资源执行何种操作。这些方法通过路径操作装饰器指定,如 @app.get(…), @app.post(…) ,@app.put(…)等。
·
FastAPI HTTP 请求方式 (HTTP Methods)
FastAPI 支持标准的 HTTP 请求方法,用于指示对资源执行何种操作。常用的有:
- GET: 获取资源。例如,获取用户信息、获取文章列表。
- POST: 创建新资源。例如,用户注册、发布新文章。
- PUT: 更新整个资源。例如,更新用户的所有信息。
- PATCH: 部分更新资源。例如,仅更新用户的邮箱地址。
- DELETE: 删除资源。例如,删除一篇文章。
这些方法通过路径操作装饰器指定,如 @app.get(…), @app.post(…) ,@app.put(…)等
FastAPI 请求参数类型区别 (Request Parameters)
FastAPI 会自动从请求的不同部分提取参数,并进行验证和转换。主要类型包括:
| 参数类型 | 应用位置 | 主要用途 | 定义方式 | 验证/元数据 | 何时使用 |
|---|---|---|---|---|---|
Path |
URL 路径 (/items/{item_id}) |
FastApi | 在路径字符串中用 {} 定义,函数参数接收 |
Path(..., ge=1, le=100) |
需要通过 URL 路径指定特定资源 ID 或分类时。 |
Query |
URL 查询字符串 (?q=hello&page=1) |
FastApi | 函数参数,可设默认值 | Query(default=10, ge=1, le=100) |
需要传递可选或有时必要的非结构化、简单参数。如:过滤、分页、排序、可选参数。 |
Field |
HTTP的Body( ) 请求体 (通常 JSON) | pydantic |
定义 BaseModel,用 Field 添加规则,函数参数接收 |
Field(..., gt=0, max_length=100) |
传递复杂、结构化数据POST, PUT, PATCH 请求中,需要接收详细数据(如用户信息、订单详情)时。 |
Path 和 Query 主要用于获取资源或传递简单的、扁平的参数。Field 用于传递复杂的数据结构,通常与 Pydantic 模型 配合使用,以确保数据的完整性和正确性。
以下是三个实例代码:
1、Path 参数 (路径参数)
from fastapi import FastAPI, Path # 导入 Path
app = FastAPI()
# --- 基础用法:获取用户信息 ---
@app.get("/users/{user_id}")
async def get_user(user_id: int): # user_id 是 Path 参数,类型为 int
# 如果访问 /users/123,user_id 的值将是整数 123
return {"user_id": user_id}
# --- 带验证和元数据的 Path 参数 ---
@app.get("/items/{item_id}")
async def read_item(item_id: int = Path(..., ge=1, le=1000, title="Item ID")): # ... 表示必填
# ge=1: 验证 item_id >= 1
# le=1000: 验证 item_id <= 1000
# title: 用于 API 文档
return {"item_id": item_id}
2. Query 参数 (路径查询参数)
from fastapi import FastAPI, Query # 导入 Query
app = FastAPI()
# --- 可选 Query 参数 ---
@app.get("/items/")
async def read_items(skip: int = 0, limit: int = 100): # skip 和 limit 是 Query 参数
# 如果访问 /items/?skip=10&limit=50,skip=10, limit=50
# 如果访问 /items/,skip=0, limit=100 (使用默认值)
return {"skip": skip, "limit": limit}
# --- 带验证规则的 Query 参数 ---
@app.get("/search/")
async def search_items(
q: str = Query(default=None, min_length=3, max_length=50), # default=None 使其可选
page: int = Query(1, ge=1, le=100), # 默认值 1,验证范围1~100
sort_order: str = Query("desc", enum=["asc", "desc"]) # 排序限制为 "asc" 或 "desc"
):
return {"q": q, "page": page, "sort_order": sort_order}
3、Field 参数 (Body( )请求体参数)
from fastapi import FastAPI, Body # 导入 Body
from pydantic import BaseModel, Field # 导入 BaseModel 和 Field
app = FastAPI()
# --- 定义请求体对象模型 ---
class Item(BaseModel):
name: str = Field(..., title="Item Name", min_length=1, max_length=100) # ... 表示必填, 文本长度1~100
remark: str = Field(None, title="Item remark", max_length=300 ) # 最大300长度
price: float = Field(..., gt=0, description="Price must be greater than zero") #...必填,gt=0 验证 > 0
tax: float = None
# --- 使用 Body 参数 ---
@app.post("/items/")
async def create_item(item: Item = Body(...)): # item 是HTTP的Body( )参数,类型为 Item对象
# FastAPI 会自动解析 JSON 请求体,验证其结构和数据,并创建一个 Item 实例
# item.name, item.price 等可以直接访问
item_dict = item.dict() # 将模型实例转换为字典
if item.tax:
item_dict.update({"total": item.price + item.tax})
return item_dict
更多推荐
所有评论(0)