构建 FastAPI 项目的最佳实践是什么?

What are the best practices for structuring a FastAPI project?

我想解决的问题:

Harsha 已经提到了我的project generator,但我认为它可以帮助未来的读者解释它背后的想法。

如果你要为你的前端服务,比如 yarnnpm。你不应该担心它们之间的结构。使用像 axios 或 Javascript 的 fetch 这样的东西,你可以从任何地方轻松地与你的后端交谈。

在构建后端时,如果你想用 Jinja 渲染模板,你可以有一些接近 MVC 模式的东西。

your_project
├── __init__.py
├── main.py
├── core
│   ├── models
│   │   ├── database.py
│   │   └── __init__.py
│   ├── schemas
│   │   ├── __init__.py
│   │   └── schema.py
│   └── settings.py
├── tests
│   ├── __init__.py
│   └── v1
│       ├── __init__.py
│       └── test_v1.py
└── v1
    ├── api.py
    ├── endpoints
    │   ├── endpoint.py
    │   └── __init__.py
    └── __init__.py 

通过在任何地方使用 __init__,我们可以从整个应用程序访问变量,就像 Django 一样。

让我们把文件夹分成几个部分:

  • 核心
    • 型号
      • database.py
    • 模式
      • users.py
      • something.py
    • settings.py
    • views (如果要渲染模板请添加)
      • v1_views.py
      • v2_views.py
  • 测试
  • v1
  • v2

型号

它适用于您的数据库模型,通过这样做您可以从 v1 和 v2 导入相同的数据库会话或对象。

架构

模式是您的 Pydantic 模型,我们称它为模式,因为它实际上用于创建 OpenAPI 模式,因为 FastAPI 基于 OpenAPI 规范,我们在任何地方都使用模式,从 Swagger 生成到端点的预期请求主体。

settings.py

用于Pydantic's Settings Management which is extremely useful, you can use the same variables without redeclaring it, to see how it could be useful for you check out our documentation for Settings and Environment Variables

观看次数

如果你打算用 Jinja 渲染你的前端,这是可选的,你可以有一些接近 MVC 模式的东西

  • 核心
    • 观看次数
      • v1_views.py
      • v2_views.py

如果要添加视图,它看起来像这样。

测试

最好将测试放在后端文件夹中。

API

通过 APIRouter 独立创建它们,而不是将所有 API 集中在一个文件中。

备注

您可以对所有导入使用绝对导入,因为我们到处都在使用 __init__,请参阅 Python's packaging 文档。

因此假设您正在尝试从 v2 导入 v1 的 endpoint.py,您可以简单地执行

from my_project.v1.endpoints.endpoint import something