iT邦幫忙

2023 iThome 鐵人賽

DAY 7
0
Modern Web

FastAPI 入門30天系列 第 7

Day-7 清晰的專案架構

  • 分享至 

  • xImage
  •  

在前幾個章節我們介紹到在實作API中如何傳遞參數,接下來我們將會用一個簡易的專案帶大家更了解 FastAPI。

那在實作之前,我們先介紹在FastAPI中常用的專案架構。

一個好的專案架構應該是一個擁有一致性、簡單明瞭、且不會出乎人預料之外的結構:

  • 如果從專案結構中無法獲得對專案內容的理解,那麼這種結構可能是不清晰的。
  • 如果需要打開資料夾才能知道裡面包含什麼模組,那這種架構是不清晰的。
  • 如果文件的出現頻率與所在位置讓人感覺是隨機的,那這種架構是不OK的。
  • 如果查看模組的位置和名稱無法讓人理解內容,那這種架構也是不OK的。

以下我們介紹兩種範例架構

微型架構

fastapi-project
├── alembic/
├── src
│   ├── schemas.py  # pydantic models
│   ├── dependencies.py
│   ├── constants.py
│   ├── service.py
│   ├── utils.py
│   ├── config.py  # global configs
│   ├── models.py  # global models
│   ├── exceptions.py  # global exceptions
│   ├── pagination.py  # global module e.g. pagination
│   ├── database.py  # db connection related stuff
│   └── main.py
├── tests/
│   ├── auth
│   ├── aws
│   └── posts
├── templates/
│   └── index.html
├── requirements
│   ├── base.txt
│   ├── dev.txt
│   └── prod.txt
├── .env
├── .gitignore
├── logging.ini
└── alembic.ini

此架構範例為 FastAPI 作者在官方文件案例中所使用,概念為按類型分離文件,此種架構對於小專案或是微服務是相當好用,但如果專案中包含太多模組就會變的雜亂。

一體式架構

fastapi-project
├── alembic/
├── src
│   ├── auth
│   │   ├── router.py
│   │   ├── schemas.py  # pydantic models
│   │   ├── models.py  # db models
│   │   ├── dependencies.py
│   │   ├── config.py  # local configs
│   │   ├── constants.py
│   │   ├── exceptions.py
│   │   ├── service.py
│   │   └── utils.py
│   ├── aws
│   │   ├── client.py  # client model for external service communication
│   │   ├── schemas.py
│   │   ├── config.py
│   │   ├── constants.py
│   │   ├── exceptions.py
│   │   └── utils.py
│   └── posts
│   │   ├── router.py
│   │   ├── schemas.py
│   │   ├── models.py
│   │   ├── dependencies.py
│   │   ├── constants.py
│   │   ├── exceptions.py
│   │   ├── service.py
│   │   └── utils.py
│   ├── config.py  # global configs
│   ├── models.py  # global models
│   ├── exceptions.py  # global exceptions
│   ├── pagination.py  # global module e.g. pagination
│   ├── database.py  # db connection related stuff
│   └── main.py
├── tests/
│   ├── auth
│   ├── aws
│   └── posts
├── templates/
│   └── index.html
├── requirements
│   ├── base.txt
│   ├── dev.txt
│   └── prod.txt
├── .env
├── .gitignore
├── logging.ini
└── alembic.ini

zhanymkanov/fastapi-best-practices: FastAPI Best Practices and Conventions we used at our startup (github.com) 中,作者受到 Netflix 的 Dispatch 專案啟發,提出了此種架構,該架構對於微型架構更具可擴展性,適用於大型單體專案。

檔案內容

在實作中,我們將所有程式碼目錄存放在 src 文件夾中:

  • src/ - 應用程式的最高層級,包含共用的模型、設定、變數等。
  • src/main.py - 專案的根目錄,初始化 FastAPI 應用程式。

每個套件都有自己的路由器(router)、模式(schemas)、模型(models)等。

  • router.py - 每個模組的核心,包含所有端點(endpoints)。
  • schemas.py - 用於 Pydantic 模型。
  • models.py - 用於資料庫模型。
  • service.py - 模組特定的商業邏輯。
  • dependencies.py - 路由器依賴注入程式。
  • constants.py - 模組特定的變數和錯誤碼。
  • config.py - 例如環境變數。
  • utils.py - 非商業邏輯函數,例如回應規範化、自定義工具等。
  • exceptions.py - 模組特定的例外,例如 PostNotFound、InvalidUserData。

當套件需要來自其他套件的服務、相依性或變數時,請使用明確的模組名稱 ( 絕對路徑 ) 導入它們。

from src.auth import constants as auth_constants
from src.notifications import service as notification_service
from src.posts.constants import ErrorCode as PostsErrorCode  # in case we have Standard ErrorCode in constants module of each package

小結

專案架構對於一個專案來說可以說是一個十分重要的基底,架構做得好可以大大的增加開發的順暢度以及後續維護的簡易性。

我們了解完通常會如何構建一個 FastAPI 的專案後,接下來幾天的介紹將會著重在用一個簡單的題目來實作。

參考資料

https://github.com/zhanymkanov/fastapi-best-practices

更大的应用 - 多个文件 - FastAPI (tiangolo.com)


上一篇
Day-6 好用的依賴注入
下一篇
Day-8 簡易庫存系統-DB設計 
系列文
FastAPI 入門30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言