fastapi个人学习记录
FastAPI快速入门指南
FastAPI是一个现代、快速(高性能)的Python Web框架,用于构建API。本指南将介绍FastAPI的基本概念和使用方法,帮助您快速上手这个强大的工具。
目录
安装
首先,您需要安装FastAPI和一个ASGI服务器(如Uvicorn)。在命令行中运行以下命令:
pip install fastapi
pip install uvicorn
创建第一个API
让我们创建一个简单的FastAPI应用程序。创建一个名为main.py
的文件,并添加以下代码:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
这段代码创建了一个基本的FastAPI应用,并定义了一个根路由("/"),当访问时返回一个JSON响应。
运行服务器
要运行您的FastAPI应用,使用以下命令:
uvicorn main:app --reload
现在,您可以在浏览器中访问 http://127.0.0.1:8000 ,将看到 {"message": "Hello World"} 的JSON响应。
路径参数
路径参数是URL路径中的变量部分。FastAPI允许您轻松定义和使用这些参数。
基本用法
@app.get("/items/{item_id}")
async def read_item(item_id: int):
return {"item_id": item_id}
在这个例子中,item_id
是一个路径参数。FastAPI会自动解析URL中的值并将其转换为指定的类型(这里是 int
)。
多个路径参数
您可以在一个路由中定义多个路径参数:
@app.get("/users/{user_id}/items/{item_id}")
async def get_user_item(user_id: int, item_id: str):
return {"user_id": user_id, "item_id": item_id}
这个路由将匹配如 "/users/42/items/foo" 的URL。
路径参数验证
FastAPI支持使用Pydantic的字段验证:
from fastapi import Path
@app.get("/items/{item_id}")
async def read_item(item_id: int = Path(..., ge=1, le=1000)):
return {"item_id": item_id}
这个例子确保 item_id
在1到1000之间。
预定义值
您可以使用Enum来限制路径参数的可能值:
from enum import Enum
class ModelName(str, Enum):
alexnet = "alexnet"
resnet = "resnet"
lenet = "lenet"
@app.get("/models/{model_name}")
async def get_model(model_name: ModelName):
if model_name == ModelName.alexnet:
return {"model_name": model_name, "message": "Deep Learning FTW!"}
if model_name.value == "lenet":
return {"model_name": model_name, "message": "LeCNN all the images"}
return {"model_name": model_name, "message": "Have some residuals"}
这确保 model_name
只能是 "alexnet"、"resnet" 或 "lenet"。
查询参数
查询参数是URL中问号后面的键值对。FastAPI让处理这些参数变得简单直观。
基本用法
@app.get("/items/")
async def read_items(skip: int = 0, limit: int = 10):
return {"skip": skip, "limit": limit}
这个路由可以处理如 "/items/?skip=20&limit=30" 的请求。如果未提供参数,将使用默认值。
可选参数
将参数类型声明为可选可以使查询参数成为可选的:
from typing import Optional
@app.get("/items/{item_id}")
async def read_item(item_id: str, q: Optional[str] = None):
if q:
return {"item_id": item_id, "q": q}
return {"item_id": item_id}
这里,q
是一个可选的查询参数。
多个参数
您可以定义任意数量的查询参数:
@app.get("/users/")
async def read_users(skip: int = 0, limit: int = 10, sort: Optional[str] = None):
return {"skip": skip, "limit": limit, "sort": sort}
这个路由可以处理如 "/users/?skip=20&limit=30&sort=name" 的请求。
参数验证
与路径参数类似,您也可以对查询参数进行验证:
from fastapi import Query
@app.get("/items/")
async def read_items(q: Optional[str] = Query(None, min_length=3, max_length=50)):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
return results
这确保当提供 q
参数时,其长度在3到50个字符之间。
布尔类型转换
FastAPI会自动处理布尔类型的查询参数:
@app.get("/items/")
async def read_items(item_id: str, is_available: bool = False):
return {"item_id": item_id, "is_available": is_available}
请求 "/items/?item_id=foo&is_available=1" 或 "/items/?item_id=foo&is_available=true" 都会将 is_available
设置为 True
。
多值查询参数
有时您可能需要接收同一参数的多个值:
from typing import List
@app.get("/items/")
async def read_items(q: Optional[List[str]] = Query(None)):
query_items = {"q": q}
return query_items
这允许处理如 "/items/?q=foo&q=bar" 的请求,其中 q
将是一个包含 "foo" 和 "bar" 的列表。
通过这些详细的示例和解释,您应该能够更好地理解和使用FastAPI中的路径参数和查询参数。这些功能允许您创建灵活和强大的API端点,能够精确地处理各种类型的请求和数据。记住,FastAPI的类型提示不仅提供了类型检查,还为您的API提供了自动文档生成和请求验证功能。
请求体
请求体是客户端发送到API的数据。在FastAPI中,请求体通常用于POST、PUT和PATCH请求,用来发送更复杂的数据结构。FastAPI使用Pydantic模型来定义、验证和序列化请求体。
基本用法
首先,让我们创建一个基本的请求体模型:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
@app.post("/items/")
async def create_item(item: Item):
return item
在这个例子中,Item
类定义了请求体的结构。当客户端发送POST请求到 "/items/" 时,FastAPI会自动解析JSON请求体并验证数据。
嵌套模型
您可以创建更复杂的嵌套模型:
class Image(BaseModel):
url: str
name: str
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
tags: list[str] = []
image: Image = None
@app.post("/items/")
async def create_item(item: Item):
return item
这允许您处理包含嵌套结构的JSON数据。
使用请求体和路径参数
您可以同时使用请求体和路径参数:
@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item):
return {"item_id": item_id, **item.dict()}
这个例子展示了如何更新特定ID的项目。
请求体 + 路径 + 查询参数
FastAPI允许您结合使用请求体、路径参数和查询参数:
@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item, q: str = None):
result = {"item_id": item_id, **item.dict()}
if q:
result.update({"q": q})
return result
多个请求体参数
有时,您可能需要在一个请求中接收多个相关的请求体:
class User(BaseModel):
username: str
full_name: str = None
@app.post("/items/{item_id}")
async def update_item(item_id: int, item: Item, user: User):
results = {"item_id": item_id, "item": item, "user": user}
return results
在这个例子中,FastAPI会期望一个包含 item
和 user
字段的JSON对象。
请求体中的字段验证
Pydantic提供了强大的字段验证功能:
from pydantic import BaseModel, Field
class Item(BaseModel):
name: str
description: str = Field(None, max_length=300)
price: float = Field(..., gt=0)
tax: float = Field(None, ge=0)
@app.post("/items/")
async def create_item(item: Item):
return item
这个例子使用 Field
来添加额外的验证:
description
的最大长度为300个字符price
必须大于0tax
(如果提供)必须大于或等于0
使用 Enum 类
您可以使用 Enum 来限制字段的可能值:
from enum import Enum
class Color(str, Enum):
red = "red"
green = "green"
blue = "blue"
class Item(BaseModel):
name: str
color: Color
@app.post("/items/")
async def create_item(item: Item):
return item
这确保 color
只能是 "red"、"green" 或 "blue"。
使用 List 和 Set
Pydantic 模型可以包含列表和集合:
from typing import List, Set
class Item(BaseModel):
name: str
description: str = None
price: float
tags: List[str] = []
unique_tags: Set[str] = set()
@app.post("/items/")
async def create_item(item: Item):
return item
这允许您处理包含数组和唯一值集合的JSON数据。
响应模型
您可以使用 Pydantic 模型来定义响应的结构:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
class ItemOut(BaseModel):
name: str
price: float
tax: float
@app.post("/items/", response_model=ItemOut)
async def create_item(item: Item):
return item
在这个例子中,即使函数返回完整的 item
,响应将只包含 ItemOut
模型中定义的字段。
通过这些详细的示例和解释,您应该能够更好地理解和使用FastAPI中的请求体。请求体允许您处理复杂的数据结构,同时利用Pydantic的强大功能进行数据验证和序列化。这不仅简化了API的开发过程,还提高了API的稳定性和可靠性。
自动API文档
FastAPI自动为您的API生成交互式文档。启动您的应用后:
- 访问 http://127.0.0.1:8000/docs 查看Swagger UI文档
- 访问 http://127.0.0.1:8000/redoc 查看ReDoc文档