构建 FastAPI 项目的最佳实践是什么?
What are the best practices for structuring a FastAPI project?
我想解决的问题:
- 目录的好名字,目的明确。
- 将所有项目文件(包括 virtualenv)保存在一个地方,所以我
可以轻松复制、移动、存档、删除整个项目或估算磁盘
space 用法。
- 创建一些选定文件集的多个副本,例如整个
应用程序、存储库或 virtualenv,同时保留一份
我不想克隆的其他文件。
- 只需通过 rsyncing 即可将正确的文件集部署到服务器
选择了一个目录。
- 很好地处理前端和后端。
Harsha 已经提到了我的project generator,但我认为它可以帮助未来的读者解释它背后的想法。
如果你要为你的前端服务,比如 yarn 或 npm。你不应该担心它们之间的结构。使用像 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
我想解决的问题:
- 目录的好名字,目的明确。
- 将所有项目文件(包括 virtualenv)保存在一个地方,所以我 可以轻松复制、移动、存档、删除整个项目或估算磁盘 space 用法。
- 创建一些选定文件集的多个副本,例如整个 应用程序、存储库或 virtualenv,同时保留一份 我不想克隆的其他文件。
- 只需通过 rsyncing 即可将正确的文件集部署到服务器 选择了一个目录。
- 很好地处理前端和后端。
Harsha 已经提到了我的project generator,但我认为它可以帮助未来的读者解释它背后的想法。
如果你要为你的前端服务,比如 yarn 或 npm。你不应该担心它们之间的结构。使用像 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