FastAPI Web開發(fā)入門、進(jìn)階與實(shí)戰(zhàn)
定 價(jià):129 元
叢書名:Web開發(fā)技術(shù)叢書
這是一本從實(shí)戰(zhàn)角度介紹FastAPI web開發(fā)的入門與進(jìn)階型技術(shù)書。本書沒有過(guò)多的理論介紹,完全從一線工作角度入手,介紹日常web開發(fā)需要掌握的相關(guān)知識(shí)。本書共分為4篇16章: 第1篇是基礎(chǔ)篇,主要介紹FastAPI的基礎(chǔ)知識(shí),包括FastAPI的基本信息、安裝使用、常規(guī)操作、中間件、數(shù)據(jù)庫(kù)相關(guān)內(nèi)容。作為初學(xué)者,掌握這部分內(nèi)容就可以快速上手使用FastAPI,處理各種日常問(wèn)題。 第二篇是進(jìn)階篇,主要圍繞與FastAPI相關(guān)的高級(jí)技能展開,包括異常處理、功能擴(kuò)展、安全認(rèn)證、性能、測(cè)試等相關(guān)內(nèi)容。 第三篇是實(shí)戰(zhàn)篇,主要從案例的角度對(duì)FastAPI在典型應(yīng)用場(chǎng)景中的落地進(jìn)行分享,包括短鏈應(yīng)用、websocket、基于公眾號(hào)的掛號(hào)系統(tǒng)等應(yīng)用場(chǎng)景。 第四篇是部署篇,這部分重點(diǎn)介紹如何實(shí)現(xiàn)FastAPI的自動(dòng)化部署,這數(shù)據(jù)高階人員技能。本篇提供了三種自動(dòng)化部署方式。
FastAPI被認(rèn)為是取代Flask和Django的高性能的Web框架,是業(yè)界公認(rèn)的Python Web的未來(lái)。尤其是在Python盛行的當(dāng)下,F(xiàn)astAPI前景更被看好。InfoWorld發(fā)布的2021年最佳開源軟件中,F(xiàn)astAPI位列其中。FastAPI具有運(yùn)行快速、編碼快捷、錯(cuò)誤更少、操作直觀、簡(jiǎn)易、代碼簡(jiǎn)短、穩(wěn)健、基于標(biāo)準(zhǔn)。但是學(xué)習(xí)FastAPI有一定的門檻,本書從0開始,手把手教你玩轉(zhuǎn)FastAPI,是一本從入門到精通的好書。
Preface 前 言 FastAPI框架誕生于2018年12月,如今已經(jīng)活躍在各大廠家的產(chǎn)品中,如HttpRunner(一個(gè)通用測(cè)試框架),這足以說(shuō)明它越來(lái)越受到人們的喜愛。截至本書完稿時(shí),F(xiàn)astAPI在GitHub上已收獲54100余顆星,且仍然在快速增長(zhǎng)中,與Flask這個(gè)老牌框架的距離在慢慢拉近(Flask有61800余顆星)。 在國(guó)內(nèi),使用FastAPI開發(fā)Web應(yīng)用程序已經(jīng)開始流行。特別是在測(cè)試領(lǐng)域,國(guó)內(nèi)有非常多的企業(yè)在生產(chǎn)環(huán)境中將FastAPI作為主要開發(fā)框架。越來(lái)越多的Python程序員慢慢從Flask框架遷移到FastAPI,并開始在生產(chǎn)環(huán)境中進(jìn)行應(yīng)用。 作者之所以被FastAPI吸引,主要是因?yàn)樗瑫r(shí)支持同步和異步特性。對(duì)于同步來(lái)說(shuō),從Flask遷移過(guò)來(lái)沒什么壓力;對(duì)于異步來(lái)說(shuō),F(xiàn)astAPI在單線程的模式下也可以支持更多的任務(wù)并發(fā)處理,結(jié)合依賴注入和各種模型校驗(yàn)等,可以給開發(fā)人員帶來(lái)更快、更高效、更便捷的體驗(yàn)。當(dāng)然,F(xiàn)astAPI還有很多其他優(yōu)秀的特性,本書會(huì)進(jìn)行深入分析。 FastAPI的流行之風(fēng)已形成,但是國(guó)內(nèi)卻少有完整地介紹如何將FastAPI應(yīng)用到生產(chǎn)環(huán)境中的教程,這對(duì)想使用FastAPI的用戶來(lái)說(shuō)無(wú)疑是一個(gè)壞消息。為此作者在公眾號(hào)上發(fā)布了一系列與FastAPI基礎(chǔ)使用相關(guān)的文章,得到了讀者的廣泛好評(píng)。有不少讀者建議作者寫一本內(nèi)容全面、講解具體、實(shí)戰(zhàn)性強(qiáng)的圖書,于是,本書誕生了。 適合閱讀本書的讀者 要想快速且順暢地掌握本書內(nèi)容,需要廣大讀者掌握Python基礎(chǔ)知識(shí)。若讀者對(duì)Python完全不了解,則建議先對(duì)Python進(jìn)行簡(jiǎn)單學(xué)習(xí),以便無(wú)障礙地閱讀本書。 具體來(lái)說(shuō),適合閱讀本書的讀者如下: 所有Python Web初中級(jí)開發(fā)人員。 想要從其他框架(如Flask、Django等)轉(zhuǎn)向FastAPI的Python工程師。 Python Web開發(fā)愛好者。 Python Web方向的后端工程師/運(yùn)維工程師。 想使用FastAPI進(jìn)行測(cè)試開發(fā)工作的工程師。 本書特點(diǎn) 本書的項(xiàng)目中包括了一些常用的知識(shí)點(diǎn),從基礎(chǔ)到實(shí)戰(zhàn)都有所涉及,對(duì)于一些常見疑難問(wèn)題,也有所陳述并提供了對(duì)應(yīng)的解決方案,希望讀者可以從中受益。 本書主要在作者多年的項(xiàng)目實(shí)踐經(jīng)驗(yàn)基礎(chǔ)上編寫而成,有以下特點(diǎn)。 (1)內(nèi)容全面,可滿足初中級(jí)讀者的需求。本書從基礎(chǔ)使用、運(yùn)行原理到進(jìn)階擴(kuò)展再到高級(jí)應(yīng)用,都進(jìn)行了深度講解。無(wú)論是初級(jí)讀者的安裝部署、快速上手需求,還是中級(jí)讀者的二次開發(fā)、高級(jí)實(shí)踐需求,本書都能很好地滿足。 (2)內(nèi)容實(shí)用,可真正幫助讀者高效工作。本書所有的案例均來(lái)自實(shí)際開發(fā)項(xiàng)目,圍繞一線實(shí)踐需求展開。尤其對(duì)消息隊(duì)列的使用、緩存限流器的原理和使用、錯(cuò)誤統(tǒng)計(jì)的實(shí)現(xiàn)等讀者關(guān)心的內(nèi)容,本書進(jìn)行了深度解讀。通過(guò)閱讀本書,讀者可以真正上手開發(fā)自己的項(xiàng)目,并實(shí)現(xiàn)獨(dú)立部署上線。 (3)內(nèi)含一個(gè)大型的完整案例及多個(gè)來(lái)自一線的小案例。為了幫助讀者把所學(xué)知識(shí)落地到實(shí)際工作中,本書給出了大量案例,讀者可以邊閱讀邊實(shí)操。另外,為了完整展現(xiàn)開發(fā)全流程,讓讀者掌握使用FastAPI開發(fā)項(xiàng)目的方法,本書還給出了一個(gè)大型綜合案例預(yù)約掛號(hào)系統(tǒng),其中包括項(xiàng)目框架結(jié)構(gòu)規(guī)劃、路由分組模塊化、數(shù)據(jù)表模型設(shè)計(jì)、數(shù)據(jù)庫(kù)配置、API實(shí)現(xiàn)、異常錯(cuò)誤處理、日志記錄、訂單處理、接口測(cè)試、部署上線等內(nèi)容。 (4)提供完整且可運(yùn)行的示例源代碼。每章所涉及的示例代碼都是完整可運(yùn)行的。通過(guò)示例代碼,讀者可以看到FastAPI對(duì)相關(guān)功能的實(shí)現(xiàn)過(guò)程,也能直觀體驗(yàn)具體業(yè)務(wù)邏輯的處理過(guò)程。 開發(fā)工具版本說(shuō)明 本書使用的開發(fā)工具版本如下: Python 3.9.5。 FastAPI 0.72.0。 PyCharm IDE 2021.2。 本地環(huán)境開發(fā)主要使用Windows 10,生產(chǎn)環(huán)境部署基于Linux的CentOS 7.6。 反饋與交流 本書中的所有示例代碼均托管于碼云(https://gitee.com/xiaozhong1988/fastapi_tutorial)上,讀者可以通過(guò)安裝Git客戶端來(lái)獲取相關(guān)示例代碼。 雖然作者使用FastAPI框架已有些時(shí)日,并在生產(chǎn)環(huán)境中進(jìn)行了正式應(yīng)用,但是不同企業(yè)或個(gè)人的業(yè)務(wù)環(huán)境、使用場(chǎng)景千差萬(wàn)別,加之作者的水平有限,所以本書給出的部分代碼的寫法可能不是最優(yōu)的,也可能存在錯(cuò)誤。關(guān)于代碼錯(cuò)誤和優(yōu)化的相關(guān)問(wèn)題,歡迎大家批評(píng)指正,也懇請(qǐng)讀者不吝賜教。 讀者可以關(guān)注公眾號(hào)程序員小鐘同學(xué),也可以加入QQ群(247491107),與眾多FastAPI的愛好者一起學(xué)習(xí)交流。 致謝 首先要感謝FastAPI框架的作者Tiangolo創(chuàng)造了這么優(yōu)秀的產(chǎn)品。 其次要感謝TurboSnail研發(fā)團(tuán)隊(duì)的領(lǐng)航員馬杰老師,是他帶我進(jìn)入軟件開發(fā)領(lǐng)域。 還要感謝在IT之路上能讓作者堅(jiān)持下來(lái)并給予很多指導(dǎo)和幫助的陳煥老師,在作者灰心喪氣時(shí),陳老師給予了鼓勵(lì)及支持,沒有陳老師的幫助就沒有作者在IT領(lǐng)域的成就。感謝在本書編寫的過(guò)程中給予作者幫助的郭志強(qiáng)、李時(shí)濱及IT之路上的其他伙伴們,他們給作者的幫助是無(wú)價(jià)的。感謝龍艷給予作者的肯定和支持。還要特別感謝哥哥鐘遠(yuǎn)幸給予的建議和指導(dǎo)。 另外,還要感謝教導(dǎo)過(guò)并時(shí)時(shí)記掛著作者的劉善初和黃宗宜老師。 最后要特別感謝在創(chuàng)作本書期間家人給予的幫助,特別是父親和母親的無(wú)私關(guān)懷和照顧。
目 錄 Contents 前言 第1章 初識(shí)FastAPI1 1.1 FastAPI框架概述1 1.1.1 FastAPI與其他Web框架2 1.1.2 FastAPI的特性2 1.2 異步編程基礎(chǔ)4 1.2.1 并發(fā)編程機(jī)制4 1.2.2 并發(fā)與并行5 1.2.3 同步與異步6 1.2.4 阻塞與非阻塞6 1.3 asyncio協(xié)程概念7 1.4 asyncio協(xié)程簡(jiǎn)單應(yīng)用8 第2章 初試FastAPI11 2.1 搭建開發(fā)環(huán)境11 2.1.1 安裝Python語(yǔ)言包11 2.1.2 PyCharm的安裝14 2.1.3 PyCharm IDE配置解析器15 2.1.4 PyCharm IDE解析器的切換18 2.1.5 PIP安裝源的設(shè)置19 2.2 新建FastAPI項(xiàng)目22 2.2.1 新建簡(jiǎn)單項(xiàng)目22 2.2.2 項(xiàng)目依賴庫(kù)的安裝24 2.3 簡(jiǎn)單項(xiàng)目介紹27 2.3.1 創(chuàng)建app實(shí)例對(duì)象27 2.3.2 添加API請(qǐng)求路由注冊(cè)28 2.3.3 添加后端渲染模板路由29 2.3.4 啟動(dòng)服務(wù)運(yùn)行30 2.3.5 uvicorn參數(shù)說(shuō)明34 2.3.6 查看交互式API文檔35 第3章 FastAPI基礎(chǔ)入門38 3.1 app應(yīng)用配置參數(shù)詳解38 3.1.1 開啟Debug模式39 3.1.2 關(guān)于API交互式文檔參數(shù)40 3.1.3 關(guān)閉交互式文檔訪問(wèn)42 3.1.4 全局routes參數(shù)說(shuō)明42 3.1.5 全局異常/錯(cuò)誤捕獲43 3.2 API端點(diǎn)路由注冊(cè)和匹配44 3.2.1 路由節(jié)點(diǎn)元數(shù)據(jù)44 3.2.2 路由URL匹配46 3.2.3 基于APIRouter實(shí)例的 路由注冊(cè)48 3.3 同步和異步API端點(diǎn)路由50 3.3.1 同步API端點(diǎn)路由50 3.3.2 異步API端點(diǎn)路由51 3.4 多應(yīng)用掛載51 3.4.1 主從應(yīng)用掛載52 3.4.2 掛載其他WSGI應(yīng)用52 3.5 自定義配置swagger_ui53 3.6 應(yīng)用配置信息讀取55 3.6.1 基于文件讀取配置參數(shù)55 3.6.2 基于Pydantic和.env環(huán)境變量 讀取配置參數(shù)56 3.6.3 給配置讀取加上緩存58 3.7 API端點(diǎn)路由函數(shù)參數(shù)58 3.7.1 路徑操作及路徑函數(shù)59 3.7.2 Path參數(shù)59 3.7.3 Query參數(shù)63 3.7.4 Body參數(shù)67 3.7.5 Form數(shù)據(jù)和文件處理77 3.7.6 Header參數(shù)81 3.7.7 Cookie參數(shù)設(shè)置和讀取83 3.8 請(qǐng)求報(bào)文85 3.8.1 Request對(duì)象85 3.8.2 更多Request屬性信息86 3.9 響應(yīng)報(bào)文87 3.9.1 HTTP狀態(tài)碼分類88 3.9.2 指定HTTP狀態(tài)碼89 3.9.3 使用response_model定義響應(yīng) 報(bào)文內(nèi)容90 3.9.4 Response類型93 3.9.5 自定義Response類型98 3.10 后臺(tái)異步任務(wù)執(zhí)行99 3.11 應(yīng)用啟動(dòng)和關(guān)閉事件100 第4章 FastAPI異常及錯(cuò)誤102 4.1 HTTPException異常103 4.1.1 HTTPException簡(jiǎn)單源碼分析103 4.1.2 HTTPException的使用104 4.1.3 覆蓋HTTPException異常處理105 4.2 RequestValidationError錯(cuò)誤106 4.2.1 RequestValidationError的使用106 4.2.2 覆蓋RequestValidationError 錯(cuò)誤處理107 4.3 自定義異常108 4.3.1 自定義異常的實(shí)現(xiàn)108 4.3.2 自定義內(nèi)部錯(cuò)誤碼和異常109 4.4 中間件拋出自定義異常110 第5章 Pydantic數(shù)據(jù)模型管理113 5.1 Pydantic介紹113 5.2 Pydantic的使用114 5.2.1 模型常見數(shù)據(jù)類型114 5.2.2 模型參數(shù)必選和可選115 5.2.3 模型多層嵌套116 5.2.4 模型對(duì)象實(shí)例化116 5.2.5 模型對(duì)象的轉(zhuǎn)換117 5.2.6 模型對(duì)象的復(fù)制118 5.2.7 異常信息的捕獲119 5.2.8 用Field()函數(shù)擴(kuò)展更多復(fù)雜 驗(yàn)證120 5.2.9 自定義驗(yàn)證器123 5.2.10 自定義驗(yàn)證器的優(yōu)先級(jí)124 5.2.11 多字段或模型共享校驗(yàn)器125 5.2.12 root_validator根驗(yàn)證器126 5.3 Pydantic在FastAPI中的應(yīng)用127 5.3.1 模型類和Body的請(qǐng)求127 5.3.2 模型類和依賴注入關(guān)系128 5.3.3 模型Config類和ORM轉(zhuǎn)化130 第6章 FastAPI依賴注入機(jī)制詳解133 6.1 依賴注入框架134 6.2 依賴項(xiàng)及其聲明方式139 6.2.1 函數(shù)式依賴項(xiàng)140 6.2.2 類方式依賴項(xiàng)142 6.2.3 多個(gè)依賴項(xiàng)注入和依賴項(xiàng) 傳參143 6.3 多層依賴項(xiàng)嵌套注入144 6.4 多個(gè)依賴對(duì)象注入146 6.5 不同位置上的依賴項(xiàng)146 6.5.1 全局依賴項(xiàng)的注入147 6.5.2 路徑操作依賴項(xiàng)的注入148 6.5.3 路由分組依賴項(xiàng)的注入149 第7章 FastAPI中間件151 7.1 HTTP請(qǐng)求中間件151 7.2 @app.middleware裝飾器中間件152 7.3 CORSMiddleware跨域中間件155 7.3.1 跨域中間件的使用156 7.3.2 跨域中間件源碼分析157 7.4 其他中間件161 7.4.1 HTTPSRedirectMiddleware 中間件161 7.4.2 TrustedHostMiddleware中間件162 7.5 自定義中間件164 7.5.1 基于BaseHTTPMiddleware 自定義中間件164 7.5.2 日志追蹤鏈路ID165 7.5.3 IP白名單中間件167 7.5.4 基于中間件獲取響應(yīng)報(bào)文 內(nèi)容168 第8章 數(shù)據(jù)庫(kù)的應(yīng)用170 8.1 數(shù)據(jù)庫(kù)基礎(chǔ)170 8.1.1 SQL概述170 8.1.2 SQL數(shù)據(jù)庫(kù)170 8.1.3 NoSQL數(shù)據(jù)庫(kù)171 8.2 Python操作SQLite數(shù)據(jù)庫(kù)171 8.2.1 創(chuàng)建并鏈接到數(shù)據(jù)庫(kù)172 8.2.2 游標(biāo)對(duì)象操作數(shù)據(jù)172 8.3 ORM操作數(shù)據(jù)庫(kù)173 8.4 SQLAlchemy庫(kù)174 8.4.1 數(shù)據(jù)驅(qū)動(dòng)異步和同步說(shuō)明174 8.4.2 SQLAlchemy同步使用方式175 8.4.3 SQLAlchemy異步使用方式179 8.4.4 SQLAlchemy ORM反向生成 模型184 8.5 SQLModel庫(kù)185 8.5.1 SQLModel同步使用方式186 8.5.2 SQLModel異步使用方式188 8.6 在FastAPI中整合異步 SQLAlchemy處理190 8.6.1 需求分析和結(jié)構(gòu)規(guī)劃190 8.6.2 應(yīng)用配置信息讀取191 8.6.3 配置數(shù)據(jù)庫(kù)引擎191 8.6.4 使用yield管理會(huì)話依賴項(xiàng)192 8.6.5 定義表模型192 8.6.6 表模型CRUD封裝193 8.6.7 創(chuàng)建FastAPI實(shí)例并完成 表創(chuàng)建194 8.6.8 定義對(duì)外可見的API195 8.6.9 完善對(duì)外可見的API195 8.6.10 Alembic數(shù)據(jù)庫(kù)版本管理199 8.7 Redis數(shù)據(jù)庫(kù)及aioredis使用201 8.7.1 連接Redis數(shù)據(jù)庫(kù)202 8.7.2 Redis客戶端對(duì)象實(shí)例化202 8.7.3 Redis基本緩存的應(yīng)用203 8.7.4 Redis發(fā)布訂閱的應(yīng)用206 8.7.5 Redis分布式鎖的應(yīng)用208 第9章 安全認(rèn)證機(jī)制211 9.1 OpenAPI規(guī)范211 9.2 基于標(biāo)準(zhǔn)HTTP的身份驗(yàn)證方案213 9.2.1 HTTPBasic基本認(rèn)證方案213 9.2.2 HTTPDigest摘要認(rèn)證方案215 9.3 基于APIKey的特定密鑰方案221 9.4 基于OAuth 2的授權(quán)機(jī)制頒發(fā) 令牌方案225 9.4.1 JWT組成結(jié)構(gòu)225 9.4.2 JWT應(yīng)用實(shí)踐227 9.4.3 OAuth 2參數(shù)說(shuō)明228 9.4.4 OAuth 2主體角色230 9.4.5 客戶端模式230 9.4.6 密碼模式237 9.4.7 授權(quán)碼模式243 9.4.8 簡(jiǎn)化模式253 第10章 短鏈應(yīng)用實(shí)戰(zhàn)254 10.1 應(yīng)用開發(fā)背景254 10.2 應(yīng)用系統(tǒng)功能需求描述255 10.3 項(xiàng)目代碼編寫256 10.3.1 項(xiàng)目規(guī)劃256 10.3.2 應(yīng)用配置信息讀取257 10.3.3 配置數(shù)據(jù)庫(kù)引擎257 10.3.4 使用yield管理會(huì)話依賴項(xiàng)257 10.3.5 定義表模型258 10.3.6 用戶信息表CURD封裝259 10.3.7 短鏈信息表CURD封裝260 10.3.8 創(chuàng)建FastAPI實(shí)例并初始 化表261 10.3.9 創(chuàng)建測(cè)試賬號(hào)262 10.3.10 定義短鏈重定向接口262 10.3.11 定義短鏈生成接口263 10.3.12 將子路由添加到根路由并 啟動(dòng)服務(wù)267 第11章 WebSocket Vue簡(jiǎn)易聊天室 實(shí)戰(zhàn)269 11.1 WebSocket簡(jiǎn)介269 11.2 項(xiàng)目系統(tǒng)描述270 11.3 項(xiàng)目代碼編寫271 11.3.1 項(xiàng)目代碼結(jié)構(gòu)271 11.3.2 前端頁(yè)面開發(fā)272 11.3.3 后端開發(fā)280 11.3.4 跨進(jìn)程WebSocket通信290 第12章 預(yù)約掛號(hào)系統(tǒng)實(shí)戰(zhàn)298 12.1 應(yīng)用開發(fā)背景及系統(tǒng)功能需求299 12.2 項(xiàng)目框架結(jié)構(gòu)規(guī)劃300 12.3 使用路由分組模塊化程序301 12.3.1 APIRouter參數(shù)說(shuō)明302 12.3.2 APIRouter路由分組創(chuàng)建303 12.3.3 視圖函數(shù)綁定303 12.3.4 APIRouter路由分組注冊(cè)304 12.4 數(shù)據(jù)表模型設(shè)計(jì)304 12.4.1 數(shù)據(jù)庫(kù)安裝304 12.4.2 數(shù)據(jù)表設(shè)計(jì)308 12.4.3 模型類逆向生成310 12.4.4 數(shù)據(jù)庫(kù)引擎配置313 12.5 后端項(xiàng)目基礎(chǔ)框架搭建315 12.5.1 數(shù)據(jù)庫(kù)配置315 12.5.2 定制統(tǒng)一API內(nèi)容規(guī)范317 12.5.3 定制全局異常/錯(cuò)誤處理320 12.5.4 基于中間件日志記錄322 12.6 關(guān)鍵業(yè)務(wù)API實(shí)現(xiàn)334 12.6.1 微信登錄授權(quán)334 12.6.2 獲取首頁(yè)醫(yī)院信息337 12.6.3 獲取醫(yī)生列表信息340 12.6.4 獲取醫(yī)生排班信息341 12.6.5 獲取排班信息詳情345 12.6.6 訂單提交并支付346 12.6.7 未支付訂單再次支付353 12.6.8 微信支付回調(diào)357 12.6.9 歷史預(yù)約詳情列表接口361 12.6.10 其他業(yè)務(wù)接口說(shuō)明361 12.7 超時(shí)訂單處理362 12.7.1 消息隊(duì)列說(shuō)明362 12.7.2 AMQP介紹362 12.7.3 本地安裝RabbitMQ364 12.7.4 RabbitMQ簡(jiǎn)單應(yīng)用369 12.7.5 RabbitMQ死信隊(duì)列371 12.7.6 訂單超時(shí)后自動(dòng)取消的實(shí)現(xiàn)373 12.8 同步轉(zhuǎn)異步處理382 12.8.1 asgiref轉(zhuǎn)換庫(kù)介紹383 12.8.2 asgiref轉(zhuǎn)換庫(kù)應(yīng)用383 第13章 基于Pytest的API測(cè)試385 13.1 Pytest簡(jiǎn)單應(yīng)用385 13.1.1 unittest和Pytest的對(duì)比386 13.1.2 pytest.fixture裝飾器的使用390 13.1.3 測(cè)試配置文件conftest.py395 13.2 用FastAPI進(jìn)行API單元測(cè)試397 13.2.1 基于TestClient的單元測(cè)試397 13.2.2 基于Httpx的異步單元測(cè)試398 第14章 生產(chǎn)環(huán)境部署詳解405 14.1 Linux服務(wù)器下部署應(yīng)用程序405 14.1.1 分配具有root權(quán)限的 普通用戶406 14.1.2 Linux系統(tǒng)上安裝Python 3406 14.1.3 基于pyenv管理Python版本407 14.1.4 基于pipenv管理虛擬環(huán)境410 14.1.5 生成依賴項(xiàng)配置文件412 14.1.6 基于Gunicorn Uvicorn的 服務(wù)部署414 14.1.7 基于Supervisor的服務(wù)進(jìn)程 管理416 14.1.8 基于OpenResty的反向代理419 14.1.9 PostgreSQL數(shù)據(jù)庫(kù)的安裝423 14.2 基于SVN自動(dòng)化部署425 14.3 基于Docker進(jìn)行服務(wù)部署427 14.3.1 Docker的安裝和常用命令428 14.3.2 基于Dockerfile構(gòu)建鏡像430 14.3.3 Docker容器化部署與運(yùn)行432 14.4 Docker下的環(huán)境變量433 14.4.1 基于OS標(biāo)準(zhǔn)庫(kù)433 14.4.2 基于Pydantic中的BaseSettings 自動(dòng)綁定并解析環(huán)境變量434 14.4.3 Docker下的環(huán)境變量讀取434 14.5 基于Docker Compose進(jìn)行服務(wù) 編排436 14.5.1 多服務(wù)容器獨(dú)立運(yùn)行部署436 14.5.2 多Docker容器一鍵編排部署437 14.6 基于Gogs Drone進(jìn)行可持續(xù) 集成441 14.6.1 通過(guò)Gogs搭建自助Git服務(wù)441 14.6.2 通過(guò)Drone搭建持續(xù)集成和 持續(xù)交付444 第15章 FastAPI實(shí)戰(zhàn)常見問(wèn)題454 15.1 依賴注入項(xiàng)的傳參454 15.2 自定義插件開發(fā)456 15.2.1 插件模板基類的定義456 15.2.2 實(shí)現(xiàn)類似Flask鉤子事件 插件457 15.3 body重復(fù)消費(fèi)引發(fā)阻塞問(wèn)題460 15.3.1 阻塞問(wèn)題復(fù)現(xiàn)460 15.3.2 解決方案462 15.4 全局request變量465 15.5 同步和異步相互轉(zhuǎn)換467 15.5.1 asgiref轉(zhuǎn)換包467 15.5.2 asyncer轉(zhuǎn)換包469 15.6 Model響應(yīng)報(bào)文的排序470 15.7 同步和異步郵件發(fā)送471 15.7.1 同步方式472 15.7.2 異步方式474 15.8 基于Jaeger實(shí)現(xiàn)分布式 鏈路追蹤476 15.8.1 分布式鏈路追蹤的簡(jiǎn)單定義476 15.8.2 OpenTracing數(shù)據(jù)模型477 15.8.3 Jaeger介紹478 15.8.4 Jaeger安裝和應(yīng)用479 15.8.5 基于Jaeger SDK實(shí)現(xiàn)鏈路 追蹤480 15.8.6 FastAPI整合Jaeger SDK482 15.8.7 基于Jaeger SDK的跨服務(wù) 鏈路統(tǒng)計(jì)486 15.9 基于Sentry實(shí)現(xiàn)錯(cuò)誤信息收集489 15.9.1 Sentry安裝和配置489 15.9.2 FastAPI框架中引入Sentry492