FastAPI的初步學習(Django用戶過來的)

我一直以來是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 需要額外集成
ORMDjango 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的結構模式

模塊javafastapi_best_architecture
視圖controllerapi
數據傳輸dtoschema
業務邏輯service + implservice
數據訪問dao / mappercrud
模型entitymodel

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/85406.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/85406.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/85406.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

提升IT運維效率 貝銳向日葵推出自動化企業腳本功能

在企業進行遠程IT運維管理的過程中,難免會涉及很多需要批量操作下發指令的場景,包括但不限于下列場景: ● ?規模設備部署與初始化、設備配置更新 ● 業務軟件安裝與系統維護,進行安全加固或執行問題修復命令 ● 遠程設備監控與…

最簡單的遠程桌面連接方法是什么?系統自帶內外網訪問實現

在眾多遠程桌面連接方式中,使用 Windows 系統自帶的遠程桌面連接功能是較為簡單的方法之一,無論是在局域網內還是通過公網進行遠程連接,都能輕松實現。 一、局域網內連接步驟 1、 開啟目標計算機遠程桌面功能:在目標計算機&…

JVM(2)——垃圾回收算法

本文將穿透式解析JVM垃圾回收核心算法,涵蓋7大基礎算法4大現代GC實現3種內存分配策略,通過15張動態示意圖GC日志實戰分析,帶您徹底掌握JVM內存自動管理機制。 一、GC核心概念體系 1.1 對象存亡判定法則 引用計數法致命缺陷: // …

基于Spring Boot+Vue的“暖寓”宿舍管理系統設計與實現(源碼及文檔)

基于Spring BootVue的“暖寓”宿舍管理系統設計與實現 第 1 章 緒論 1.1 論文研究主要內容 1.1.1 系統概述 1.1.2 系統介紹 1.2 國內外研究現狀 第 2 章 關鍵技術介紹 2.1 關鍵性開發技術的介紹 2.1.1 Java簡介 2.1.2 Spring Boot框架 2.2 其他相關技術 2.2.1 Vue.J…

基于Java的不固定長度字符集在指定寬度和自適應模型下圖片繪制生成實戰

目錄 前言 一、需求介紹 1、指定寬度生成 2、指定列自適應生成 二、Java生成實現 1、公共方法 2、指定寬度生成 3、指定列自適應生成 三、總結 前言 在當今數字化與信息化飛速發展的時代,圖像的生成與處理技術正日益成為眾多領域關注的焦點。從創意設計到數…

軟考 系統架構設計師系列知識點之雜項集萃(93)

接前一篇文章:軟考 系統架構設計師系列知識點之雜項集萃(92) 第169題 人工智能技術已成為當前國際科技競爭的核心技術之一,AI芯片是占據人工智能市場的法寶。AI芯片有別于通常處理器芯片,它應具備四種關鍵特征。&…

Kotlin實現文件下載斷點續傳(RandomAccessFile全解析)

本文將深入探討如何使用Kotlin和RandomAccessFile實現高效的斷點續傳功能,涵蓋原理分析、完整代碼實現、性能優化及工程實踐要點。 一、斷點續傳核心原理 1.1 HTTP斷點續傳協議 #mermaid-svg-EfmgPUx3SFkso8Fc {font-family:"trebuchet ms",verdana,aria…

linux-headers-$(uname -r)和kmod是什么?

2025年6月16日,周一清晨 Linux-headers-$(uname -r)與kmod包詳解 一、linux-headers-$(uname -r)包 linux-headers-(uname -r)是Linux系統中與當前運行內核版本匹配的內核頭文件包,其中(uname -r)會自動替換為當前內核版本號(如5.13.0-19-g…

使用axios及和spirng boot 交互

Axios Axios是一個基于Promise的HTTP庫,可以發送get、post等請求,它作用于瀏覽器和Node.js中。當運行在瀏覽器時,使用XMLHttpRequest接口發送請求;當運行在Node.js時,使用HTTP對象發送請求。 使用步驟: 第…

布局文件的逐行詳細解讀

總覽 源碼 <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto&…

VTK 顯示大量點云數據及交互(點云拾取、著色、測量等)功能

VTK (Visualization Toolkit) 是一個強大的開源可視化庫&#xff0c;非常適合處理點云數據。下面將介紹如何使用 VTK 顯示大量點云數據&#xff0c;并實現點云拾取、著色、測量等功能。 基本點云顯示 創建一個基本的點云顯示程序&#xff1a; cpp #include <vtkSmartPoi…

性能優化 - 高級進階: 性能優化全方位總結

文章目錄 Pre1. 概述&#xff1a;性能優化提綱與使用場景2. 準備階段2.1 明確優化范圍與目標2.2 環境與工具準備 3. 數據收集與指標確認3.1 關鍵資源維度與指標項3.2 監控體系搭建與初始采集3.3 日志與追蹤配置 4. 問題定位思路4.1 從整體到局部的分析流程4.2 常見瓶頸維度檢查…

Mybatis之Integer類型字段為0,入庫為null

背景&#xff1a; 由于項目某個功能用到優先級字段來判斷&#xff0c;需要在mysql表中定義一個字段XX&#xff0c;類型為int&#xff0c;默認為0&#xff0c;具體值由后臺配置&#xff0c;正常入庫即可 問題&#xff1a; 由于后臺配置存量其他類型的數據無需該字段&#xff0c…

上海市計算機學會競賽平臺2022年3月月賽丙組洗牌

題目描述 給定一個整數 nn&#xff0c;表示 nn 張牌&#xff0c;牌的編號為 11 到 nn。 再給定一個洗牌置換 f1,f2,…,fnf1?,f2?,…,fn?&#xff0c;進行一次洗牌操作時&#xff0c;應將第一號位置的牌交換到第 f1f1? 號位置&#xff0c;將第 ii 號位置的牌交換到第 fifi…

DINO-R1:激勵推理能力的視覺基礎模型

摘要 近期&#xff0c;人們對大型語言模型&#xff08;如DeepSeek-R1&#xff09;推理能力的關注呈爆炸式增長&#xff0c;通過基于強化學習的微調框架&#xff08;如組相對策略優化&#xff08;Group Relative Policy Optimization&#xff0c;GRPO&#xff09;方法&#xff…

Linux--LVM邏輯卷擴容

Linux–LVM邏輯卷擴容 文章目錄 Linux--LVM邏輯卷擴容?? LVM 常用命令分類及基本格式? 1. 物理卷(PV)相關命令? 2. 卷組(VG)相關命令? 3. 邏輯卷(LV)相關命令?? 三、查看類命令簡寫說明使用命令及基本格式:lvm邏輯卷擴容步驟:1.添加硬盤設備2.檢測新增硬盤 添加…

C#基礎語法與控制臺操作

1. 控制臺操作基礎 控制臺程序是學習C#的起點。以下是一些常用的控制臺操作方法&#xff1a; 1.1. 清除控制臺 Console.Clear(); // 清除控制臺內容1.2. 輸出字符串 Console.WriteLine("Hello World!"); // 在屏幕的當前位置換行輸出字符串 Console.Write("…

100.Complex[]同時儲存實數和虛數兩組double的數組 C#例子

在信號處理中&#xff0c;IQ 數據&#xff08;In-phase and Quadrature&#xff09;通常表示復數形式的信號&#xff0c;其中實部表示同相分量&#xff0c;虛部表示正交分量。Complex[] data 是一個包含 IQ 數據的數組&#xff0c;每個元素是一個復數&#xff0c;表示一個信號樣…

停止追逐 React 重渲染

大多數開發者都在浪費時間對抗多余的重渲染。真正的 React 架構師根本讓問題無從產生——下面就來揭開他們的思路&#xff0c;以及為何大多數所謂的性能優化技巧反而拖慢了你的應用。 重渲染的無盡輪回 先來直擊痛點&#xff1a;如果還在項目里到處撒 useMemo、useCallback&…

流水線的安全與合規 - 構建可信的交付鏈

流水線的安全與合規 - 構建可信的交付鏈 “安全左移 (Shift-Left Security)”的理念 “安全左移”是 DevSecOps 的核心理念,指的是將安全測試和考量,從軟件開發生命周期 (SDLC) 的末端(發布前),盡可能地向左移動到更早的階段(如編碼、構建、測試階段)。 為何對 SRE 至…