返回
FastAPI 开发中的那些坑
见解分享
2023-10-13 10:37:32
在 FastAPI 开发过程中,踩坑是不可避免的。本文将分享一些常见的 FastAPI 踩坑经验,帮助开发者避免重蹈覆辙。
路由注册
FastAPI 中的路由注册使用 @app.route
装饰器。需要注意的是,装饰器中指定的路径必须以斜杠 /
开头。如果忘记添加斜杠,FastAPI 将无法正确注册路由,导致请求无法被处理。
例如:
@app.route("users") # 错误,缺少斜杠
def get_users():
...
正确写法:
@app.route("/users") # 正确,以斜杠开头
def get_users():
...
参数类型标注
FastAPI 支持在路由处理函数的参数中使用类型标注。类型标注有助于提高代码可读性和可维护性。但是,需要注意的是,FastAPI 无法自动将字符串参数转换为其他类型。如果需要将字符串参数转换为其他类型,需要显式地进行类型转换。
例如:
@app.post("/users")
def create_user(name: str):
# 如果需要将 name 转换为 int 类型,需要显式转换
user_id = int(name)
...
响应类型
FastAPI 的响应类型通常使用 Pydantic 模型定义。需要注意的是,Pydantic 模型必须是可序列化的。如果模型中包含不可序列化的字段,FastAPI 将无法将响应转换为 JSON。
例如:
class User:
name: str
password: bytes # 不可序列化的字段
@app.get("/users")
def get_users():
users = [User(...), User(...)]
return users
在上面的示例中,User
模型中包含了一个不可序列化的字段 password
。这会导致 FastAPI 无法将响应转换为 JSON。正确做法是使用可序列化的字段类型,例如 str
或 int
。
异常处理
FastAPI 提供了内置的异常处理机制。但是,需要注意的是,FastAPI 仅处理由 FastAPI 自身或其依赖项引发的异常。如果应用程序抛出自定义异常,需要显式地注册异常处理程序。
例如:
from fastapi.responses import JSONResponse
from fastapi.exceptions import HTTPException
@app.exception_handler(HTTPException)
async def http_exception_handler(request: Request, exc: HTTPException):
return JSONResponse(
status_code=exc.status_code,
content={"detail": exc.detail}
)
性能优化
FastAPI 是一种高性能的 Web 框架。但是,不当的使用可能会导致性能问题。常见的性能优化技巧包括:
- 使用异步 I/O
- 避免使用阻塞操作
- 使用缓存
- 优化数据库查询