本書涵蓋了以下內(nèi)容:怎樣使用FastAPI構(gòu)建Web應(yīng)用程序。FastAPI、Starlette與 Pydantic之間的區(qū)別及聯(lián)系。讓FastAPI框架與眾不同的兩項性,也就是對異步函數(shù)的支持,以及數(shù)據(jù)類型的檢測及驗證機制。Python 3.8及后續(xù)版本所支持的新功能,尤其是類型注解機制。同步Python代碼與異步Python代碼之間的區(qū)別。怎樣與外部的API及服務(wù)相連接。
編輯推薦
FastAPI是個年輕而穩(wěn)健的框架,它設(shè)計得相當(dāng)清晰,并且利用了Python語言中的一些新性。正如其名稱所示,這個框架的速度確實快,能夠與采用Go語言所編寫的框架相爭。熟悉Python語言的開發(fā)者能夠通過這本實用教程,學(xué)到如何運用FastAPI框架,以盡可能少的代碼迅速開發(fā)出Web應(yīng)用。
本書作者描述了FastAPI開發(fā)中的諸多細節(jié),并通過各種示例,講解了表單、數(shù)據(jù)庫訪問、圖表與地圖制作等高級話題。這本書能夠幫助你迅速了解RESTful API、數(shù)據(jù)驗證、授權(quán),以及性能優(yōu)化等技術(shù)。FastAPI與Flask及Django框架類似,用過那兩種框架的讀者很容易就能學(xué)會FastAPI。
專家推薦
這本書讓你輕松學(xué)會FastAPI。作者熟練地演示了這個框架的用法,讓家很容易就能理解FastAPI的一些概念。你可以將書里的實用知識,立刻運用到實際的編程中。
Ganesh Harke,
花旗銀行(Citibank)的高級軟件工程師
這本書詳細講解了FastAPI框架及其周邊產(chǎn)品,讓讀者迅速而全面地掌握如何用這套技術(shù)做Web開發(fā)。
William Jamir Silva,
Adjust GmbH 的高級軟件工程師
前言這是一本關(guān)于FastAPI 的實用教程,告訴家如何使用這款當(dāng)代的Web 框架,以當(dāng)代的Python 語言來做開發(fā)。另外,你也可以將這本書當(dāng)成一個故事,你會看到我們?nèi)绾螌⒆约核龅降钠婷钗锛儞Q成有用的工具。雖說沒有銀色的子彈(No silver bullet,相當(dāng)于沒有靈丹妙藥),可要是真的遇到了狼人,還就是得靠它才行(提前說一下,我們后面確實會碰到狼人)。筆者從1970 年代中期,開始編寫科學(xué)應(yīng)用程序。1977 年,第一次在PDP-11計算機上面,接觸到了UNIX 操作系統(tǒng)以及C 語言,我當(dāng)時感覺到,像UNIX這樣的系統(tǒng),以后應(yīng)該會流行起來。1980 年代與1990 年代初,互聯(lián)網(wǎng)還沒有呈現(xiàn)出今天的規(guī)模,但那個時候,已經(jīng)有了許多很棒的免費軟件與技術(shù)信息。1993 年的互聯(lián)網(wǎng),處在剛剛起步的階段,那時出現(xiàn)了一款叫作Mosaic 的網(wǎng)頁瀏覽器,我當(dāng)時感覺到,像Mosaic 這樣的瀏覽器,以后應(yīng)該會流行起來。幾年后,筆者成立了一間做Web 開發(fā)的公司,當(dāng)時的開發(fā)工具,就是老生常談的那幾樣,也就是PHP、HTML 與Perl。過了幾年,我們接到一個合約項目,直到那時,我才開始試用Python,它竟然能夠如此迅速地訪問、操縱并顯示數(shù)據(jù),這很令我贊嘆。我只拿了兩個星期的空閑時間,就把一款需要四位開發(fā)者用一年才寫好的C 程序,以Python 語言重制了一遍。當(dāng)時我感覺到,像Python 這樣的編程語言,以后應(yīng)該會流行起來。從此以后,筆者的多數(shù)工作,用的就是Python 語言以及針對這門語言的Web框架了,這主要是指Flask 與Django。我尤其喜歡簡潔的Flask,所以在許多任務(wù)里面,都采用它來做開發(fā)。但是,我在幾年前發(fā)現(xiàn)了一個寶藏,這是一種新的Web 框架,叫作FastAPI,它是由Sebastián Ramírez 編寫的。筆者閱讀了FastAPI 的文檔,其中提到的設(shè)計思路與設(shè)計理念,給我留下了深刻印象(文檔寫得很棒,家可以去這里查閱:https://fastapi.tiangolo.com)。尤其是那個介紹開發(fā)歷史的頁面(https://oreil.ly/Ds-xM),讓我體會到,他是在很謹慎地評估了與FastAPI 同類的方案之后,才決定建立這樣一個新框架的。這不是一個自說自話的項目,也不是一個隨便玩玩的東西,而是一套能夠認真解決現(xiàn)實開發(fā)問題的框架。所以,當(dāng)時我感覺到,像FastAPI 這樣的框架,以后應(yīng)該會流行起來。我用FastAPI 做了一套生物醫(yī)學(xué)方面的API,由于效果不錯,因此我們在第二年組織了一個團隊,把以前的核心API,用FastAPI 重寫了一遍。重寫之后的API 目前仍在使用,而且運作得很好。我們在那次重寫之中獲得的經(jīng)驗,家都會在這本書里面看到,我們當(dāng)時都認為,重寫之后的代碼比以前好,它的速度更快,bug 也更少。值得一提的是,那個團隊里面的一些人,根本就沒有用過Python,而且在所有的人里面,我是唯一一個用過FastAPI 的。所以,當(dāng)筆者有機會給《Introducing Python》一書寫后續(xù)作品時,我向出版方OReilly 建議的首選話題,就是FastAPI。筆者認為,F(xiàn)astAPI 的影響力至少跟Flask 與Django 持平,甚至有可能更。剛才說過,F(xiàn)astAPI 網(wǎng)站本身,已經(jīng)提供了一流的文檔,而且詳細講述了與Web 開發(fā)有關(guān)的常見話題,例如數(shù)據(jù)庫、認證、部署等。既然如此,為什么還要寫這樣的一本書呢?這是因為,這不是一本把已經(jīng)有人講過的那些知識,給全部重講一遍的書,那樣的書太累人了。這是一本為了有用而寫的書,它要幫助你迅速掌握FastAPI的主要概念,并加以運用。我會把值得家去研究的技術(shù)指出來,還會針對日常的開發(fā)任務(wù)給出建議。書里的每一章,都會用一個預(yù)覽(也就是內(nèi)容提要)來開頭。然后,筆者會詳細講述這一章的話題,當(dāng)然也會偶爾跑個題。最后,會用一個回顧(也就是小結(jié))來概括全章。雖然觀點應(yīng)該建立在事實之上,但老話說得好,事實本身也是有觀點的(These are the opinions on which my facts are based)。所以,筆者在書里講的內(nèi)容,可能與每位讀者的具體經(jīng)歷有所出入,但我還是希望這些內(nèi)容,能夠給家提供足夠的幫助,讓你成為一位更有效率的Web 開發(fā)者。排版約定本書采用以下排版約定。斜體(Italic)表示新術(shù)語、URL、電子郵件地址、文件名和文件擴展名。等寬字體(Constant width)表示程序清單,在段落內(nèi)表示程序元素,例如變量、函數(shù)名稱、數(shù)據(jù)庫、數(shù)據(jù)類型、環(huán)境變量、語句和關(guān)鍵字。粗體等寬字體(Constant width bold)表示應(yīng)由用戶原封不動輸入的命令或其他文本。斜體等寬字體(Constant width italic)表示應(yīng)該替換成用戶提供值的文本,或者由上下文決定的值。表示提示或建議。表示一般性說明。如何使用示例代碼本書的補充材料( 例如示例代碼、習(xí)題等), 可以從https://github.com/madscheme/fastapi 下載。如果有技術(shù)問題或是在使用示例代碼時遇到困難,請發(fā)電子郵件至support@oreilly.com。本書是要幫你完成工作的。一般來說,如果本書提供了示例代碼,你可以把它用在你的程序或文檔中。除非你使用了很一部分代碼,否則無需聯(lián)系我們獲得許可。比如,用本書的幾個代碼片段寫一個程序就無需獲得許可,銷售或分發(fā)OReilly 圖書的示例集則需要獲得許可;引用本書中的示例代碼回答問題無需獲得許可,將書中量的代碼放到你的產(chǎn)品文檔中則需要獲得許可。我們很希望但并不強制要求你在引用本書內(nèi)容時加上引用說明。引用說明一般包括書名、作者、出版社和ISBN,例如:FastAPI by Bill Lubanovic (OReilly).Copyright 2024 Bill Lubanovic, 978-1-098-13550-8。如果你覺得自己對示例代碼的使用超出了上述許可范圍,請通過permissions@oreilly.com 與我們聯(lián)系。OReilly 在線學(xué)習(xí)平臺(OReilly Online Learning)近40 年來,OReilly Media 致力于提供技術(shù)和商業(yè)培訓(xùn)、知識和卓越見解,來幫助眾多公司取得成功。公司獨有的專家和改革創(chuàng)新者網(wǎng)絡(luò)通過OReilly 書籍、文章以及在線學(xué)習(xí)平臺,分享他們的專業(yè)知識和實踐經(jīng)驗。OReilly 在線學(xué)習(xí)平臺按照您的需要提供實時培訓(xùn)課程、深入學(xué)習(xí)渠道、交互式編程環(huán)境以及來自O(shè)Reilly 和其他200 多家出版商的量書籍與視頻資料。更多信息,請訪問網(wǎng)站:https://www.oreilly.com/。聯(lián)系我們?nèi)魏斡嘘P(guān)本書的意見或疑問,請按照以下地址聯(lián)系出版社。美國:OReilly Media, Inc.1005 Gravenstein Highway NorthSebastopol, CA 95472中國:北京市西城區(qū)西直門南街2 號成銘廈C 座807 室(100035)奧萊利技術(shù)咨詢(北京)有限公司這本書在OReilly 網(wǎng)站上面有相應(yīng)的網(wǎng)頁,其中包含勘誤表、示例代碼,以及其他一些附加信息。這個頁面的網(wǎng)址是:https://oreil.ly/FastAPI。有勘誤內(nèi)容請反饋給:errata@oreilly.com.cn。與我們的書籍和課程有關(guān)的新聞及信息,參見https://oreilly.com 網(wǎng)站。我們的LinkedIn:https://linkedin.com/company/oreilly-media。我們的Twitter:https://twitter.com/oreillymedia。我們的YouTube:https://youtube.com/oreillymedia。致謝筆者要感謝自己在許多地方遇到的許多位朋友,是你們讓我獲益良多:? Serra High School(Serra 中學(xué))? The University of Pittsburgh(匹茲堡學(xué))? The Chronobiology Laboratories, University of Minnesota(明尼蘇達學(xué)時間生物學(xué)實驗室)? Intran? Crosfield-Dicomed? Northwest Airlines(西北航空)? Tela? WAM!NET? Mad Scheme? SSESCO 公司? Intradyn 公司? Keep? Thomson Reuters(湯森路透)? Cray 公司? Penguin Computing 公司? Internet Archive(互聯(lián)網(wǎng)檔案館)? CrowdStrike 公司? Flywheel
Bill Lubanovic擁有四十多年的開發(fā)經(jīng)驗,精通Linux系統(tǒng)、Web開發(fā),以及Python語言。他最Z近與同事采用FastAPI重寫了一套做生物醫(yī)學(xué)研究的型API。Bill是OReilly出版的《Linux System Administration》一書的合著者,他還撰寫了OReilly的《Introducing Python》。
目錄
前言 1
第一部分 新知識介紹
第1 章 當(dāng)代的Web . 11
1.1 預(yù)覽 . 11
1.2 服務(wù)與API 12
1.2.1 API 的類型 .12
1.2.2 HTTP .14
1.2.3 REST(RESTful) .14
1.2.4 JSON 與API 數(shù)據(jù)格式.17
1.2.5 JSON:API 17
1.2.6 GraphQL 17
1.3 并發(fā) .18
1.4 分層 .19
1.5 數(shù)據(jù) .25
1.6 小結(jié) .25
第2 章 當(dāng)代的Python 27
2.1 預(yù)覽 .27
2.2 工具 .27
2.3 Python 入門 .28
2.3.1 Python 語言本身 .29
2.3.2 Python 語言的軟件包管理機制 30
2.3.3 虛擬環(huán)境 .30
2.3.4 Poetry 31
2.3.5 源代碼的格式 32
2.3.6 測試 32
2.3.7 源代碼控制與持續(xù)集成 33
2.3.8 Web 開發(fā)工具 33
2.4 API 與服務(wù) 34
2.5 變量只不過是個名字 34
2.6 類型提示36
2.7 數(shù)據(jù)結(jié)構(gòu)37
2.8 Web 框架 37
2.8.1 Django 37
2.8.2 Flask 38
2.8.3 FastAPI.38
2.9 小結(jié) .39
第二部分 FastAPI 導(dǎo)覽
第3 章 FastAPI 簡介 43
3.1 預(yù)覽 .43
3.2 什么是FastAPI 43
3.3 FastAPI 應(yīng)用程序 .44
3.4 處理HTTP 請求 50
3.4.1 通過URL 路徑傳遞參數(shù) .51
3.4.2 通過查詢字符串傳遞參數(shù) 53
3.4.3 通過請求體傳遞參數(shù).55
3.4.4 通過Header 傳遞參數(shù) 57
3.4.5 通過多種方式獲取HTTP 請求之中的數(shù)據(jù) 59
3.4.6 用哪一種方式獲取數(shù)據(jù)最好 .59
3.5 給出HTTP 響應(yīng) 59
3.5.1 狀態(tài)碼 60
3.5.2 Header 61
3.5.3 HTTP 響應(yīng)的類型 61
3.5.4 類型轉(zhuǎn)換 .62
3.5.5 通過response_model 返回另一種數(shù)據(jù)模型 63
3.6 自動化的文檔 .66
3.7 如何處理更為復(fù)雜的數(shù)據(jù) 69
3.8 小結(jié) .69
第4 章 異步、并發(fā)與Starlette 簡介 .71
4.1 預(yù)覽 .71
4.2 Starlette .71
4.3 并發(fā)的類型 72
4.3.1 分布式計算與并行計算 73
4.3.2 操作系統(tǒng)級別的進程.73
4.3.3 操作系統(tǒng)級別的線程.74
4.3.4 綠色線程 .74
4.3.5 回調(diào) 75
4.3.6 Python 生成器 75
4.3.7 Python 的async、await 關(guān)鍵字與asyncio 庫 77
4.4 FastAPI 與異步開發(fā) 79
4.5 直接使用Starlette 做Web 開發(fā) .82
4.6 插曲:清理Clue House .83
4.7 小結(jié) .85
第5 章 Pydantic、類型提示與數(shù)據(jù)模型簡介 . 87
5.1 預(yù)覽 .87
5.2 類型提示87
5.3 給數(shù)據(jù)歸組 91
5.4 其他一些數(shù)據(jù)歸組方案 .97
5.5 一個簡單的示例 99
5.6 對類型做驗證 103
5.7 對取值做出驗證 .104
5.8 小結(jié) 107
第6 章 描述依賴關(guān)系 109
6.1 預(yù)覽 109
6.2 什么是依賴 .109
6.3 由依賴導(dǎo)致的問題 . 110
6.4 依賴注入. 111
6.5 FastAPI 的依賴注入 . 111
6.6 在FastAPI 代碼里面描述依賴關(guān)系 112
6.7 依賴關(guān)系的作用范圍 113
6.7.1 為單個的路徑函數(shù)指定依賴關(guān)系 . 113
6.7.2 為多條路徑指定同一種依賴關(guān)系 . 115
6.7.3 為整個應(yīng)用程序指定依賴關(guān)系 116
6.8 小結(jié) 116
第7 章 各種Web 框架之間的對比 117
7.1 預(yù)覽 117
7.2 Flask 與FastAPI 的異同 . 118
7.2.1 處理URL 之中的參數(shù) 118
7.2.2 處理查詢字符串之中的參數(shù) 120
7.2.3 處理請求體之中的參數(shù) .120
7.2.4 處理標頭之中的參數(shù)121
7.3 Django 框架與Flask 及FastAPI 的異同 .122
7.4 這三種Web 開發(fā)框架在其他方面的性對比 123
7.5 這三個框架在數(shù)據(jù)庫方面的異同 124
7.6 如何在這三種框架之間選擇 .125
7.7 其他一些Python Web 框架 125
7.8 小結(jié) 126
第三部分 制作網(wǎng)站
第8 章 Web 層 129
8.1 預(yù)覽 129
8.2 插曲:從上到下、從下到上,還是從內(nèi)到外 130
8.3 REST 式的設(shè)計 132
8.4 網(wǎng)站的文件與目錄布局 134
8.5 網(wǎng)站的第一版代碼 .137
8.6 處理HTTP 請求 .140
8.7 在頂級app 下面添加多個次一級的subrouter .142
8.8 構(gòu)建Web 層 143
8.9 定義數(shù)據(jù)模型 143
8.10 Stub Data 與Fake Data .144
8.11 先確定一些常見的操作 144
8.12 建立Fake Data .145
8.13 開始測試 151
8.14 利用FastAPI 自動生成的測試表單作測試 .152
8.15 Web 層應(yīng)該通過Service 層做中介,而不應(yīng)直接與Data 層通信 155
8.16 分頁與排序 .156
8.17 小結(jié) 158
第9 章 Service 層 . 159
9.1 預(yù)覽 159
9.2 如何確定網(wǎng)站所應(yīng)提供的服務(wù) 159
9.3 網(wǎng)站的文件布局 .160
9.4 確保網(wǎng)站安全 161
9.5 實現(xiàn)Service 層中的各種函數(shù)161
9.6 測試 163
9.7 Service 層的其他事務(wù) 165
9.7.1 日志記錄 166
9.7.2 指標測量、監(jiān)控、可觀測性 166
9.7.3 追蹤 .167
9.7.4 雜項 .167
9.8 小結(jié) 168
第10 章 Data 層 . 169
10.1 預(yù)覽 169
10.2 DB-API .169
10.3 SQLite 172
10.4 網(wǎng)站的文件布局 174
10.5 讓網(wǎng)站運作起來 175
10.6 測試 181
10.6.1 全面測試 182
10.6.2 單元測試 193
10.7 小結(jié) 196
第11 章 認證與授權(quán) 197
11.1 預(yù)覽 197
11.2 又得跑個題:我們真的需要做認證嗎 198
11.3 認證方式 199
11.4 全局認證:讓所有人共用密語 .200
11.5 對每一位訪問者分別做認證 204
11.6 采用新式技術(shù)給每一位訪問者分別做認證 .205
11.6.1 OAuth2 206
11.6.2 表示用戶的User 模型 .208
11.6.3 實現(xiàn)Data 層中與User 有關(guān)的操作 208
11.6.4 實現(xiàn)一套與Data 層中的User 操作類似的Fake 操作 .210
11.6.5 實現(xiàn)Service 層中與User 有關(guān)的操作 .212
11.6.6 實現(xiàn)Web 層中與User 有關(guān)的操作 214
11.6.7 測試 216
11.6.8 修改頂層的主程序 216
11.6.9 回顧早前實現(xiàn)的認證步驟 .217
11.6.10 JWT 218
11.6.11 經(jīng)由OIDC 協(xié)議,通過第三方賬號做認證.219
11.7 授權(quán) 220
11.8 中間件 222
11.8.1 CORS(跨域資源共享) 222
11.8.2 通過第三方包實現(xiàn)認證與授權(quán) 224
11.9 小結(jié) 225
第12 章 測試 227
12.1 預(yù)覽 227
12.2 對Web API 做測試 .227
12.3 對哪里的代碼做測試 .228
12.4 如何做測試 .229
12.5 Pytest .230
12.6 網(wǎng)站的文件布局 231
12.7 自動化的單元測試 232
12.7.1 Mocking .232
12.7.2 Test Double 與Fake 237
12.7.3 對Web 層做測試 239
12.7.4 對Service 層做測試 .242
12.7.5 對Data 層做測試 244
12.8 自動化的集成測試 246
12.9 Repository 模式 248
12.10 自動化的全面測試 248
12.11 安全測試 251
12.12 負載測試 252
12.13 小結(jié) .253
第13 章 將網(wǎng)站部署到生產(chǎn)環(huán)境之中 255
13.1 預(yù)覽 255
13.2 部署網(wǎng)站 255
13.2.1 采用多個Worker 來運行服務(wù)器 .256
13.2.2 HTTPS .257
13.2.3 Docker .257
13.2.4 云服務(wù) .258
13.2.5 Kubernetes .259
13.3 改善網(wǎng)站的性能 259
13.3.1 Async 260
13.3.2 緩存 260
13.3.3 數(shù)據(jù)庫、文件、內(nèi)存 260
13.3.4 隊列 261
13.3.5 Python 本身 261
13.4 疑難排解 262
13.4.1 確定這是哪一類問題 262
13.4.2 查看日志 263
13.4.3 收集指標 263
13.5 小結(jié) 264
第四部分 漫談
第14 章 數(shù)據(jù)庫、數(shù)據(jù)科學(xué)以及一點點AI 267
14.1 預(yù)覽 267
14.2 數(shù)據(jù)存儲方案 268
14.3 關(guān)系型數(shù)據(jù)庫及SQL 269
14.3.1 SQLAlchemy 269
14.3.2 SQLModel .272
14.3.3 SQLite .272
14.3.4 PostgreSQL 273
14.3.5 EdgeDB 273
14.4 非關(guān)系型數(shù)據(jù)庫(NoSQL 數(shù)據(jù)庫) .274
14.4.1 Redis 275
14.4.2 MongoDB 275
14.4.3 Cassandra 275
14.4.4 Elasticsearch .275
14.5 SQL 數(shù)據(jù)庫中的NoSQL 性 275
14.6 數(shù)據(jù)庫負載測試 277
14.7 數(shù)據(jù)科學(xué)與人工智能(AI) .279
14.8 小結(jié) 282
第15 章 文件 283
15.1 預(yù)覽 283
15.2 如何支持分塊傳輸 283
15.3 上傳文件 283
15.3.1 通過File() 實現(xiàn)文件上傳 284
15.3.2 通過UploadFile 實現(xiàn)文件上傳 285
15.4 下載文件 287
15.4.1 FileResponse 287
15.4.2 StreamingResponse 288
15.5 提供靜態(tài)文件服務(wù) 289
15.6 小結(jié) 291
第16 章 表單與模板 . 293
16.1 預(yù)覽 293
16.2 表單 293
16.3 模板 296
16.4 小結(jié) 300
第17 章 數(shù)據(jù)發(fā)現(xiàn)與數(shù)據(jù)可視化 301
17.1 預(yù)覽 301
17.2 Python 與數(shù)據(jù)處理 .301
17.3 讀取并輸出PSV 格式的文本數(shù)據(jù) 302
17.3.1 用csv 包讀取PSV 文件 .303
17.3.2 用python-tabulate 包讀取PSV 文件 304
17.3.3 用pandas 讀取PSV 文件并輸出其內(nèi)容 .305
17.4 讀取SQLite 數(shù)據(jù)庫中的數(shù)據(jù)并以網(wǎng)頁的形式顯示 306
17.4.1 與圖表顯示有關(guān)的軟件包 .307
17.4.2 圖表示例1:試用Plotly 308
17.4.3 圖表示例2:繪制直方圖 311
17.4.4 與地圖顯示有關(guān)的軟件包 .312
17.4.5 地圖示例 314
17.5 小結(jié) 315
第18 章 游戲 317
18.1 預(yù)覽 317
18.2 與游戲制作有關(guān)的Python 包 317
18.3 拆分游戲邏輯 318
18.4 游戲的設(shè)計 .319
18.5 Web 層的第一部分工作:實現(xiàn)游戲的初始化 320
18.6 Web 層的第二部分工作:實現(xiàn)游戲的后續(xù)步驟 322
18.7 Service 層的第一部分工作:實現(xiàn)游戲的初始化 324
18.8 Service 層的第二部分工作:判斷玩家猜測得是否正確325
18.9 測試 326
18.10 Data 層的工作:實現(xiàn)游戲的初始化 327
18.11 開始玩這個猜單詞游戲 .327
18.12 小結(jié) .329
附錄A 延伸閱讀 . 331
附錄B 用作示例數(shù)據(jù)的神秘生物及探索者 335