FastAPI 是基于 Python 的现代 Web 框架,以其高性能、易用性和自动生成的交互式 API 文档而备受关注。它适用于需要快速开发和高吞吐量的应用场景,如微服务、实时数据处理和机器学习服务。
FastAPI 是一个高性能的 Web 框架,基于 Python 3.7+ 构建,依赖于 Starlette(用于网络框架核心)和 Pydantic(用于数据校验)。它以 OpenAPI 和 JSON Schema 标准为核心,为开发者提供自动化的文档生成和强大的数据验证功能。
asyncio)。async 和 await 实现高并发。FastAPI 通常与 Uvicorn 一起使用,后者是一个轻量级的 ASGI 服务器。
pip install fastapi uvicorn创建文件 main.py:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"message": "Hello, FastAPI!"}
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}运行服务器:
uvicorn main:app --reload访问以下地址即可看到结果:
http://127.0.0.1:8000:返回 {"message": "Hello, FastAPI!"}。http://127.0.0.1:8000/items/42?q=example:返回 {"item_id": 42, "q": "example"}。自动生成的文档:
http://127.0.0.1:8000/docshttp://127.0.0.1:8000/redocFastAPI 支持 GET、POST、PUT、DELETE 等 HTTP 方法。示例:
from fastapi import FastAPI
app = FastAPI()
@app.post("/items/")
async def create_item(name: str, price: float):
return {"name": name, "price": price}利用 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_name": item.name, "item_price": item.price}传入 JSON 数据:
{
"name": "Laptop",
"description": "A high-end laptop",
"price": 1500.99,
"tax": 100.0
}查询参数具有自动校验和类型转换功能:
@app.get("/search/")
async def search_items(keyword: str, limit: int = 10):
return {"keyword": keyword, "limit": limit}路径参数可以通过类型提示自动校验:
@app.get("/users/{user_id}")
async def get_user(user_id: int):
return {"user_id": user_id}通过 response_model 指定返回数据结构:
from typing import List
class ItemOut(BaseModel):
name: str
price: float
@app.get("/items/", response_model=List[ItemOut])
async def list_items():
return [
{"name": "Phone", "price": 699.99, "tax": 50},
{"name": "Laptop", "price": 1500.99}
]from pydantic import BaseModel
class TodoItem(BaseModel):
id: int
title: str
completed: boolfrom fastapi import FastAPI, HTTPException
from typing import List
app = FastAPI()
todos = []
@app.post("/todos/", response_model=TodoItem)
async def create_todo(todo: TodoItem):
todos.append(todo)
return todo
@app.get("/todos/", response_model=List[TodoItem])
async def list_todos():
return todos
@app.get("/todos/{todo_id}", response_model=TodoItem)
async def get_todo(todo_id: int):
for todo in todos:
if todo.id == todo_id:
return todo
raise HTTPException(status_code=404, detail="Todo not found")
@app.put("/todos/{todo_id}", response_model=TodoItem)
async def update_todo(todo_id: int, updated_todo: TodoItem):
for index, todo in enumerate(todos):
if todo.id == todo_id:
todos[index] = updated_todo
return updated_todo
raise HTTPException(status_code=404, detail="Todo not found")
@app.delete("/todos/{todo_id}")
async def delete_todo(todo_id: int):
for index, todo in enumerate(todos):
if todo.id == todo_id:
todos.pop(index)
return {"message": "Todo deleted"}
raise HTTPException(status_code=404, detail="Todo not found")启动服务器后,可以通过 Swagger UI 测试以下功能:
FastAPI 支持中间件,用于处理全局逻辑(如请求日志记录):
from fastapi.middleware.cors import CORSMiddleware
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_methods=["*"],
allow_headers=["*"],
)FastAPI 提供 BackgroundTasks 支持异步任务处理:
from fastapi import BackgroundTasks
async def write_log(message: str):
with open("log.txt", "a") as f:
f.write(f"{message}\n")
@app.post("/log/")
async def log_message(message: str, background_tasks: BackgroundTasks):
background_tasks.add_task(write_log, message)
return {"message": "Task submitted"}使用 SQLAlchemy 集成数据库:
pip install sqlalchemy databases配置示例:
from databases import Database
from sqlalchemy import create_engine, MetaData
DATABASE_URL = "sqlite:///./test.db"
database = Database(DATABASE_URL)
engine = create_engine(DATABASE_URL)
metadata = MetaData()FastAPI 凭借其类型安全、异步支持和自动文档生成,已经成为构建现代 Web 和 API 服务的热门选择。从简单的增删改查到复杂的异步任务处理,FastAPI 为开发者提供了丰富的功能。如果你正在寻找一个高效、现代的框架,FastAPI 是一个不错的选择。