內容大鋼
FastAPI是個年輕而穩健的框架,它設計得相當清晰,並且利用了Python語言中的一些新特性。正如其名稱所示,這個框架的速度確實快,能夠與採用Go語言所編寫的框架相爭。熟悉Python語言的開發者能夠通過這本實用教程,學到如何運用FastAPI框架,以盡可能少的代碼迅速開發出Web應用。
本書作者描述了FastAPI開發中的諸多細節,並通過各種示例,講解了表單、資料庫訪問、圖表與地圖製作等高級話題。這本書能夠幫助你迅速了解RESTful API、數據驗證、授權,以及性能優化等技術。FastAPI與Flask及Django框架類似,用過那兩種框架的讀者很容易就能學會FastAPI。
作者介紹
(美)比爾·盧巴諾維奇|責編:劉熾|譯者:愛飛翔
比爾·盧巴諾維奇(Bill Lubanovic),在長達40余年的軟體開發生涯中積累了豐富的實戰經驗、開發過的項目跨越資料庫、Web、分散式系統等多個領域。他曾負責用Python重新實現流行工具Wayback Machine。
1982-1988年(Intran):在首個商業圖形工作站上開發了MetaForm。
1990-1995年(西北航空公司):編寫了一個圖形化收益管理系統,使航空公司邁入互聯網並編寫了其第一個互聯網營銷測試。
1994年(Tela):與他人共同創立了一家早期的ISP。
1995-1999年(WAM! NET):開發了Web儀錶盤和3M數字媒體倉庫。
1999-2005年(Mad Scheme):與他人共同創立了一家Web開發/托管公司。
2005年(O'Reilly):撰寫了Linux Server Security一書的部分內容。
2007年(O'Reilly):與人合著了Linux System Administration。
2010-2013年(Keep):設計並建立了Web前端和資料庫後端之間的核心服務。
2014年(O'Reilly):撰寫了本書的第1版。
2015-2016年(Internet Archive):從事API和Python版本的Wayback Machine工作。
2016-2018年(CrowdStrike):管理基於Python的服務,每天處理數十億次安全事件。比爾目前在明尼蘇達州的桑格瑞-德-薩斯卡奇山脈(Sangre de Sasquatch mountains)與妻子Mary、兒子Tome(和妻子Roxie)、女兒Karin(和丈夫Erik),以及貓咪Inga、Chester和Lucy共享幸福的家庭生活。
目錄
前言
第一部分 新知識介紹
第1章 當代的Web
1.1 預覽
1.2 服務與API
1.2.1 API的類型
1.2.2 HTTP
1.2.3 REST(RESTful)
1.2.4 JSON與API數據格式
1.2.5 JSON:API
1.2.6 GraphQL
1.3 併發
1.4 分層
1.5 數據
1.6 小結
第2章 當代的Python
2.1 預覽
2.2 工具
2.3 Python入門
2.3.1 Python語言本身
2.3.2 Python語言的軟體包管理機制
2.3.3 虛擬環境
2.3.4 Poetry
2.3.5 源代碼的格式
2.3.6 測試
2.3.7 源代碼控制與持續集成
2.3.8 Web開發工具
2.4 API與服務
2.5 變數只不過是個名字
2.6 類型提示
2.7 數據結構
2.8 Web框架
2.8.1 Django
2.8.2 Flask
2.8.3 FastAPI
2.9 小結
第二部分 FastAPI導覽
第3章 FastAPI簡介
3.1 預覽
3.2 什麼是FastAPI
3.3 FastAPI應用程序
3.4 處理HTTP請求
3.4.1 通過URL路徑傳遞參數
3.4.2 通過查詢字元串傳遞參數
3.4.3 通過請求體傳遞參數
3.4.4 通過Header傳遞參數
3.4.5 通過多種方式獲取HTTP請求之中的數據
3.4.6 用哪一種方式獲取數據最好
3.5 給出HTTP響應
3.5.1 狀態碼
3.5.2 Header
3.5.3 HTTP響應的類型
3.5.4 類型轉換
3.5.5 通過response_model返回另一種數據模型
3.6 自動化的文檔
3.7 如何處理更為複雜的數據
3.8 小結
第4章 非同步、併發與Starlette簡介
4.1 預覽
4.2 Starlette
4.3 併發的類型
4.3.1 分散式計算與並行計算
4.3.2 操作系統級別的進程
4.3.3 操作系統級別的線程
4.3.4 綠色線程
4.3.5 回調
4.3.6 Python生成器
4.3.7 Python的async、await關鍵字與asyncio庫
4.4 FastAPI與非同步開發
4.5 直接使用Starlette做Web開發
4.6 插曲:清理Clue House
4.7 小結
第5章 Pydantic、類型提示與數據模型簡介
5.1 預覽
5.2 類型提示
5.3 給數據歸組
5.4 其他一些數據歸組方案
5.5 一個簡單的示例
5.6 對類型做驗證
5.7 對取值做出驗證
5.8 小結
第6章 描述依賴關係
6.1 預覽
6.2 什麼是依賴
6.3 由依賴導致的問題
6.4 依賴注入
6.5 FastAPI的依賴注入
6.6 在FastAPI代碼裡面描述依賴關係
6.7 依賴關係的作用範圍
6.7.1 為單個的路徑函數指定依賴關係
6.7.2 為多條路徑指定同一種依賴關係
6.7.3 為整個應用程序指定依賴關係
6.8 小結
第7章 各種Web框架之間的對比
7.1 預覽
7.2 Flask與FastAPI的異同
7.2.1 處理URL之中的參數
7.2.2 處理查詢字元串之中的參數
7.2.3 處理請求體之中的參數
7.2.4 處理標頭之中的參數
7.3 Django框架與Flask及FastAPI的異同
7.4 這三種Web開發框架在其他方面的特性對比
7.5 這三個框架在資料庫方面的異同
7.6 如何在這三種框架之間選擇
7.7 其他一些Python Web框架
7.8 小結
第三部分 製作網站
第8章 Web層
8.1 預覽
8.2 插曲:從上到下、從下到上,還是從內到外
8.3 REST式的設計
8.4 網站的文件與目錄布局
8.5 網站的第一版代碼
8.6 處理HTTP請求
8.7 在頂級app下面添加多個次一級的subrouter
8.8 構建Web層
8.9 定義數據模型
8.10 Stub Data與Fake Data
8.11 先確定一些常見的操作
8.12 建立Fake Data
8.13 開始測試
8.14 利用FastAPI自動生成的測試表單作測試
8.15 Web層應該通過Service層做中介,而不應直接與Data層通信
8.16 分頁與排序
8.17 小結
第9章 Service層
9.1 預覽
9.2 如何確定網站所應提供的服務
9.3 網站的文件布局
9.4 確保網站安全
9.5 實現Service層中的各種函數
9.6 測試
9.7 Service層的其他事務
9.7.1 日誌記錄
9.7.2 指標測量、監控、可觀測性
9.7.3 追蹤
9.7.4 雜項
9.8 小結
第10章 Data層
10.1 預覽
10.2 DB-API
10.3 SQLite
10.4 網站的文件布局
10.5 讓網站運作起來
10.6 測試
10.6.1 全面測試
10.6.2 單元測試
10.7 小結
第11章 認證與授權
11.1 預覽
11.2 又得跑個題:我們真的需要做認證嗎
11.3 認證方式
11.4 全局認證:讓所有人共用密語
11.5 對每一位訪問者分別做認證
11.6 採用新式技術給每一位訪問者分別做認證
11.6.1 OAuth2
11.6.2 表示用戶的User模型
11.6.3 實現Data層中與User有關的操作
11.6.4 實現一套與Data層中的User操作類似的Fake操作
11.6.5 實現Service層中與User有關的操作
11.6.6 實現Web層中與User有關的操作
11.6.7 測試
11.6.8 修改頂層的主程序
11.6.9 回顧早前實現的認證步驟
11.6.10 JWT
11.6.11 經由OIDC協議,通過第三方賬號做認證
11.7 授權
11.8 中間件
11.8.1 CORS(跨域資源共享)
11.8.2 通過第三方包實現認證與授權
11.9 小結
第12章 測試
12.1 預覽
12.2 對Web API做測試
12.3 對哪裡的代碼做測試
12.4 如何做測試
12.5 Pytest
12.6 網站的文件布局
12.7 自動化的單元測試
12.7.1 Mocking
12.7.2 Test Double與Fake
12.7.3 對Web層做測試
12.7.4 對Service層做測試
12.7.5 對Data層做測試
12.8 自動化的集成測試
12.9 Repository模式
12.10 自動化的全面測試
12.11 安全測試
12.12 負載測試
12.13 小結
第13章 將網站部署到生產環境之中
13.1 預覽
13.2 部署網站
13.2.1 採用多個Worker來運行伺服器
13.2.2 HTTPS
13.2.3 Docker
13.2.4 雲服務
13.2.5 Kubernetes
13.3 改善網站的性能
13.3.1 Async
13.3.2 緩存
13.3.3 資料庫、文件、內存
13.3.4 隊列
13.3.5 Python本身
13.4 疑難排解
13.4.1 確定這是哪一類問題
13.4.2 查看日誌
13.4.3 收集指標
13.5 小結
第四部分 漫談
第14章 資料庫、數據科學以及一點點AI
14.1 預覽
14.2 數據存儲方案
14.3 關係型資料庫及SQL
14.3.1 SQLAlchemy
14.3.2 SQLModel
14.3.3 SQLite
14.3.4 PostgreSQL
14.3.5 EdgeDB
14.4 非關係型資料庫(NoSQL資料庫)
14.4.1 Redis
14.4.2 MongoDB
14.4.3 Cassandra
14.4.4 Elasticsearch
14.5 SQL資料庫中的NoSQL特性
14.6 資料庫負載測試
14.7 數據科學與人工智慧(AI)
14.8 小結
第15章 文件
15.1 預覽
15.2 如何支持分塊傳輸
15.3 上傳文件
15.3.1 通過File()實現文件上傳
15.3.2 通過UploadFile實現文件上傳
15.4 下載文件
15.4.1 FileResponse
15.4.2 StreamingResponse
15.5 提供靜態文件服務
15.6 小結
第16章 表單與模板
16.1 預覽
16.2 表單
16.3 模板
16.4 小結
第17章 數據發現與數據可視化
17.1 預覽
17.2 Python與數據處理
17.3 讀取並輸出PSV格式的文本數據
17.3.1 用csv包讀取PSV文件
17.3.2 用python-tabulate包讀取PSV文件
17.3.3 用pandas讀取PSV文件並輸出其內容
17.4 讀取SQLite資料庫中的數據並以網頁的形式顯示
17.4.1 與圖表顯示有關的軟體包
17.4.2 圖表示例1:試用Plotly
17.4.3 圖表示例2:繪製直方圖
17.4.4 與地圖顯示有關的軟體包
17.4.5 地圖示例
17.5 小結
第18章 遊戲
18.1 預覽
18.2 與遊戲製作有關的Python包
18.3 拆分遊戲邏輯
18.4 遊戲的設計
18.5 Web層的第一部分工作:實現遊戲的初始化
18.6 Web層的第二部分工作:實現遊戲的後續步驟
18.7 Service層的第一部分工作:實現遊戲的初始化
18.8 Service層的第二部分工作:判斷玩家猜測得是否正確
18.9 測試
18.10 Data層的工作:實現遊戲的初始化
18.11 開始玩這個猜單詞遊戲
18.12 小結
附錄A 延伸閱讀
附錄B 用作示例數據的神秘生物及探索者