我一直以來是Django重度用戶。它有清晰的MVC架構模式、多應用組織結構。它內置用戶認證、數據庫ORM、數據庫遷移、管理后臺、日志等功能,還有強大的社區支持。再搭配上Django REST framework (DRF) ,開發起來效率極高。主打功能強大、易于使用。
曾經也用Flask開發過提供純API不涉及數據庫操作的項目,相對Django確實簡潔、靈活。但沒留下什么較好的深刻印象。
最近,聽說朋友在用FastAPI開發項目,主打高性能和強大的異步處理能力。而且在網上看到「Flask已死,FastAPI是未來」的說法。于是開始學習FastAPI。
純API的FastAPI項目
看了下官方文檔:https://fastapi.tiangolo.com/zh/learn/
發現搭建一個純API的小項目,用FastAPI確實好啊。
比如一個提供固定博文展示和郵件發送的項目,目錄如下。在blogs.py、emails.py中配路由寫業務邏輯就行。
fastapi-pure-api-case
├── routers
│ ├── blogs.py
│ └── emails.py
├── README.md
└── main.py
涉及數據庫操作的多應用FastAPI項目
想到之前寫過的有近20個子應用、完全數據庫增刪改查、數據model經常變化要重度維護數據庫遷移文件的中型Django項目。我覺得用FastAPI適合微服務,這種復雜項目實現起來應該很難吧。看了官方文檔,依然摸不著頭腦。
一、我嘗試用Django的目錄結構,搭建個多子應用的FastAPI項目。類似結構如下:
my_project/
│── alembic/
│── alembic.ini
│── users/ # 用戶管理應用
│ ├── urls.py # 路由
│ ├── serializers.py # Pydantic 模型
│ ├── views.py # 業務邏輯
│ ├── models.py # SQLAlchemy 模型
│ └── utlis.py # 應用級工具集
│
│── blogs/ # 博客應用
│── ... # 其他應用
│
├── core/ # 核心基礎設施
│ ├── database.py # 數據庫連接
│ ├── settings.py # 配置管理
│ └── urls.py # 路由集中配置
│
├── utils/ # 公共工具
│ ├── auth.py # 認證工具
│ └── logging.py # 日志配置
├── main.py # 主入口文件
└── requirements.txt # 依賴文件
按上述目錄結構搞了一天,總感覺不倫不類的。但至少弄明白了三件事:
1、FastAPI中要輕松操作數據庫,要自行選擇第三方ORM工具,如SQLAlchemy 。創建數據Model要用到SQLAlchemy模型。數據庫操作要顯式創建并引用session。
2、Pydantic模型用來數據驗證、數據序列化。與ORM是完全解耦的。
3、實現數據庫遷移管理,要自行選擇第三方工具,如alembic.ini。
二,一些成熟的項目實踐參考
在自己探索一番覺得不太行后,想著FastAPI這么火,網上應該有一些比較成熟的組織項目結構的方案。
在一些搜索后,還真找到了一些:
FastAPI 最佳實踐文檔:https://github.com/zhanymkanov/fastapi-best-practices
FastAPI 最佳實踐文檔(中文翻譯):https://gitee.com/ktianc/fastapi-best-practices
FasAPI實踐之MySQL:https://github.com/fastapi-practices/fastapi_sqlalchemy_mysql
FasAPI 最佳架構文檔:https://fastapi-practices.github.io/fastapi_best_architecture_docs/
FastAPI最佳架構項目示例:https://github.com/fastapi-practices/fastapi_best_architecture
看了上面的項目,并實踐后。我意識到只要架構做好,FastAPI也可以類似Django用來開發中大型項目,同時保持高性能。
FastAPI與Django的選擇
體驗下來。FastAPI的優勢在于高性能和強大的異步處理能力,但相對Django開發效率會低很多。
對性能、高并發、異步處理要求沒那么高的企業級應用,選擇Django還是比較合適,有20年歷史,很多方面有成熟解決方案。
對于大型系統,可結合兩者優勢:
- Django:用戶認證、內容管理、后臺運營
- FastAPI:移動端API、實時數據處理、微服務接口
這種架構既能利用 Django 的開發效率,又能發揮 FastAPI 的性能優勢,是大型項目的理想選擇。
功能 | Django 內置支持 | FastAPI 需要額外集成 |
---|---|---|
ORM | Django ORM (強大且易用) | SQLAlchemy/SQLModel (需學習) |
管理后臺 | Django Admin (開箱即用) | SQLAdmin/Django Admin 移植 |
用戶認證 | 完整認證系統 (Session/Auth組) | 需手動實現 (JWT/OAuth2) |
表單處理 | Form 和 ModelForm 系統 | 依賴 HTML 前端框架 |
模板引擎 | Jinja2/Django 模板語言 | 需單獨集成 |
路由系統 | URLconf 自動處理 | 需手動組織 APIRouter |
國際化 | 完整 i18n/l10n 支持 | 需第三方庫 |
實際影響:新項目啟動時,Django 可節省 40-60% 的初始配置時間。
FastAPI中型項目的一些目錄結構參考
my_project/
├── apps/ # 核心應用目錄(類似 Django 的 apps)
│ ├── users/ # 用戶管理應用
│ │ ├── routers.py # 路由
│ │ ├── schemas.py # Pydantic 模型
│ │ ├── services.py # 業務邏輯
│ │ ├── models.py # SQLAlchemy 模型
│ │ └── dependencies.py # 應用級依賴
│ │
│ ├── products/ # 產品管理應用
│ ├── orders/ # 訂單管理應用
│ └── ... # 其他應用
│
├── core/ # 核心基礎設施
│ ├── database.py # 數據庫連接
│ ├── config.py # 配置管理
│ ├── middleware.py # 中間件
│ ├── exceptions.py # 異常處理
│ └── dependencies.py # 全局依賴項
│
├── tests/ # 測試目錄
│ ├── unit/ # 單元測試
│ └── integration/ # 集成測試
│
├── utils/ # 公共工具
│ ├── auth.py # 認證工具
│ └── logging.py # 日志配置
│
├── static/ # 靜態文件
├── templates/ # Jinja2 模板(可選)
├── alembic/ # 數據庫遷移
├── main.py # 主入口文件
└── requirements.txt # 依賴文件
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
單app的結構模式
模塊 | java | fastapi_best_architecture |
---|---|---|
視圖 | controller | api |
數據傳輸 | dto | schema |
業務邏輯 | service + impl | service |
數據訪問 | dao / mapper | crud |
模型 | entity | model |