FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,由 Python 3.6+ 类型提示驱动。它旨在快速开发,同时不需要牺牲性能。本文将带你从零开始,逐步深入到 FastAPI 的高级特性,助你高效构建 API 应用。
快速入门:搭建第一个 FastAPI 应用
1. 安装 FastAPI 和 uvicorn
首先,确保你的 Python 环境已经安装。然后,使用 pip 安装 FastAPI 和 uvicorn:
pip install fastapi uvicorn
2. 创建应用
创建一个名为 main.py 的文件,并添加以下代码:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"message": "Hello World"}
3. 运行应用
使用以下命令运行应用:
uvicorn main:app --reload
在浏览器中访问 http://127.0.0.1:8000/,你应该能看到如下信息:
{
"message": "Hello World"
}
高级特性:路由、依赖注入和中间件
1. 路由
FastAPI 支持多种路由类型,包括:
GET:获取资源POST:创建资源PUT:更新资源DELETE:删除资源
以下是一个使用 GET 和 POST 路由的示例:
from fastapi import FastAPI, HTTPException
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: int):
return {"item_id": item_id}
@app.post("/items/")
async def create_item(item: Item):
# 保存 item 到数据库...
return item
2. 依赖注入
依赖注入是一种设计模式,用于将依赖关系从应用程序代码中分离出来。FastAPI 提供了内置的依赖注入系统,可以轻松地将依赖项注入到函数中。
以下是一个使用依赖注入的示例:
from fastapi import FastAPI, Depends, HTTPException
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: int, current_user: User = Depends(get_current_user)):
return {"item_id": item_id, "owner": current_user.username}
3. 中间件
中间件是处理 HTTP 请求和响应的函数。FastAPI 允许你定义自己的中间件,以实现自定义逻辑。
以下是一个简单的中间件示例:
from fastapi import FastAPI, Request
app = FastAPI()
@app.middleware("http")
async def log_requests(request: Request, call_next):
print(f"Request {request.method} {request.url}")
response = await call_next(request)
print(f"Response {response.status_code}")
return response
高级特性:异步数据库操作、认证和授权
1. 异步数据库操作
FastAPI 支持异步数据库操作,使用 databases 包。
以下是一个使用 databases 包的示例:
from fastapi import FastAPI
from pydantic import BaseModel
from databases import Database
app = FastAPI()
# 连接到数据库
database = Database("sqlite:///./test.db")
# 定义模型
class Item(BaseModel):
id: int
name: str
@app.on_event("startup")
async def startup():
await database.connect()
@app.on_event("shutdown")
async def shutdown():
await database.disconnect()
@app.post("/items/")
async def create_item(item: Item):
query = item.dict().values()
sql = "INSERT INTO items (name) VALUES (?)"
await database.execute(sql, query)
return item
2. 认证和授权
FastAPI 提供了内置的认证和授权支持,可以使用 auth 包。
以下是一个使用 auth 包的示例:
from fastapi import FastAPI, Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
@app.post("/token")
async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends()):
user = authenticate_user(username=form_data.username, password=form_data.password)
if not user:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Incorrect username or password",
headers={"WWW-Authenticate": "Bearer"},
)
access_token = create_access_token(data={"sub": user.username})
return {"access_token": access_token, "token_type": "bearer"}
@app.get("/users/me")
async def read_users_me(token: str = Depends(oauth2_scheme)):
current_user = get_current_user(token)
return {"username": current_user.username}
总结
通过本文的学习,你应该已经掌握了 FastAPI 框架的基本用法和高级特性。FastAPI 是一个功能强大的框架,可以帮助你快速构建高性能的 API 应用。希望本文能帮助你更好地理解 FastAPI,并将其应用到实际项目中。
