返回

FastAPI 开发中的那些坑

见解分享

在 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。正确做法是使用可序列化的字段类型,例如 strint

异常处理

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
  • 避免使用阻塞操作
  • 使用缓存
  • 优化数据库查询