FastAPI 简介 FastAPI 是现代、高性能的 Python Web 框架,基于 Starlette 和 Pydantic 构建。
核心优势:
性能媲美 NodeJS 和 Go
自动生成 API 文档(Swagger UI)
类型提示,编辑器支持友好
异步支持,高并发场景首选
安装 pip install fastapi uvicorn
最简单的 API from fastapi import FastAPIapp = FastAPI() @app.get("/" ) def home (): return {"message" : "Hello FastAPI" } @app.get("/items/{item_id}" ) def get_item (item_id: int ): return {"item_id" : item_id}
运行服务器:
uvicorn main:app --reload
访问:
路由与请求方法 from fastapi import FastAPIapp = FastAPI() @app.get("/users" ) def get_users (): return {"users" : ["Alice" , "Bob" ]} @app.post("/users" ) def create_user (name: str ): return {"created" : name} @app.put("/users/{user_id}" ) def update_user (user_id: int , name: str ): return {"updated" : user_id, "name" : name} @app.delete("/users/{user_id}" ) def delete_user (user_id: int ): return {"deleted" : user_id}
请求参数 查询参数 @app.get("/search" ) def search (q: str , limit: int = 10 ): return {"query" : q, "limit" : limit}
路径参数 @app.get("/items/{item_id}" ) def get_item (item_id: int ): return {"item_id" : item_id}
请求体(JSON) from pydantic import BaseModelclass User (BaseModel ): name: str age: int email: str @app.post("/users" ) def create_user (user: User ): return {"created" : user.name, "age" : user.age}
Pydantic 数据验证 FastAPI 使用 Pydantic 自动验证数据:
from pydantic import BaseModel, EmailStr, Fieldclass Item (BaseModel ): name: str = Field(min_length=1 , max_length=50 ) price: float = Field(gt=0 ) quantity: int = Field(default=1 , ge=0 ) email: EmailStr @app.post("/items" ) def create_item (item: Item ): return item
验证失败自动返回 422 错误,带详细错误信息。
异步支持 import asyncio@app.get("/async-demo" ) async def async_endpoint (): await asyncio.sleep(1 ) return {"message" : "异步处理完成" } @app.get("/users-db" ) async def get_users (): users = await fetch_users_from_db() return users
响应模型 定义响应格式:
from pydantic import BaseModelclass UserResponse (BaseModel ): id : int name: str email: str @app.get("/users/{user_id}" , response_model=UserResponse ) def get_user (user_id: int ): user_data = { "id" : user_id, "name" : "Alice" , "email" : "alice@example.com" , "password" : "secret" } return user_data
错误处理 from fastapi import HTTPException@app.get("/items/{item_id}" ) def get_item (item_id: int ): if item_id > 100 : raise HTTPException(status_code=404 , detail="Item not found" ) return {"item_id" : item_id}
中间件 from fastapi import Requestimport time@app.middleware("http" ) async def log_requests (request: Request, call_next ): start = time.time() response = await call_next(request) duration = time.time() - start print (f"{request.method} {request.url} - {duration:.2 f} s" ) return response
静态文件与模板 from fastapi import FastAPIfrom fastapi.staticfiles import StaticFilesfrom fastapi.templating import Jinja2Templatesapp = FastAPI() app.mount("/static" , StaticFiles(directory="static" ), name="static" ) templates = Jinja2Templates(directory="templates" ) @app.get("/page" ) def page (request: Request ): return templates.TemplateResponse("index.html" , {"request" : request})
完整示例:REST API from fastapi import FastAPI, HTTPExceptionfrom pydantic import BaseModelfrom typing import List app = FastAPI(title="用户管理API" ) class User (BaseModel ): id : int name: str email: str users_db: List [User] = [] @app.get("/users" , response_model=List [User] ) def list_users (): return users_db @app.post("/users" , response_model=User ) def create_user (user: User ): if any (u.id == user.id for u in users_db): raise HTTPException(400 , "ID已存在" ) users_db.append(user) return user @app.get("/users/{user_id}" , response_model=User ) def get_user (user_id: int ): for user in users_db: if user.id == user_id: return user raise HTTPException(404 , "用户不存在" ) @app.put("/users/{user_id}" , response_model=User ) def update_user (user_id: int , updated: User ): for i, user in enumerate (users_db): if user.id == user_id: users_db[i] = updated return updated raise HTTPException(404 , "用户不存在" ) @app.delete("/users/{user_id}" ) def delete_user (user_id: int ): for i, user in enumerate (users_db): if user.id == user_id: users_db.pop(i) return {"deleted" : user_id} raise HTTPException(404 , "用户不存在" )
部署 Docker 部署 FROM python:3.10 WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD ["uvicorn" , "main:app" , "--host" , "0.0.0.0" , "--port" , "8000" ]
生产配置 uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4
总结 FastAPI 是 Python Web 开发的新一代选择,特别适合:
REST API 开发
微服务后端
高并发场景
需要自动文档的项目
对比其他框架:
框架
性能
文档
异步
学习难度
FastAPI
⭐⭐⭐⭐⭐
⭐⭐⭐⭐⭐
✅
低
Flask
⭐⭐⭐
⭐⭐
❌
低
Django
⭐⭐⭐
⭐⭐⭐
✅
中
推荐学习路径:
跑通最简单示例,看 /docs 自动文档
掌握 Pydantic 数据验证
学习异步数据库操作
实战项目练习
开始你的 FastAPI 之旅吧!