FastAPI官檔精編005 - 第一步

呆鳥云:發(fā)布本系列旨在推廣 FastAPI 以及推進(jìn) FastAPI 中文官檔翻譯撑帖,目前,F(xiàn)astAPI 官檔已完成 98% 的中文翻譯弓叛,如果您對(duì) FastAPI 有興趣璃弄,可以為這個(gè)很贊的開源項(xiàng)目做些貢獻(xiàn),比如校譯牧抽、翻譯嘉熊、審閱等。

開源項(xiàng)目的發(fā)展離不開大家的支持扬舒。當(dāng)然最簡(jiǎn)單的就是在 Github 上點(diǎn) Star 了阐肤。

如果覺得 FastAPI 不錯(cuò),您也可以轉(zhuǎn)發(fā)讲坎、轉(zhuǎn)載本文孕惜,讓更多人知道 Python 還有這么簡(jiǎn)單、快速的后端支持庫(kù)晨炕。

FastAPI 官檔地址:https://fastapi.tiangolo.com/zh/

下面先列出幾個(gè)需要 Review 的 PR衫画,希望大家多多參與。

以下為正文瓮栗。


本指南將逐步介紹 FastAPI 的絕大部分功能碧磅。

本指南的每個(gè)章節(jié)循序漸進(jìn)碘箍,但又有各自的主題,您可以直接閱讀所需章節(jié)鲸郊,解決特定的 API 需求丰榴。

本指南還是參考手冊(cè),供您隨時(shí)查閱秆撮。

運(yùn)行代碼

本指南中的所有代碼都能直接復(fù)制使用(實(shí)際上四濒,這些代碼都是經(jīng)過測(cè)試的 Python 文件)。

要運(yùn)行示例职辨,只需把代碼復(fù)制到 main.py盗蟆,用以下命令啟動(dòng) uvicorn

$ uvicorn main:app --reload

INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [28720]
INFO:     Started server process [28722]
INFO:     Waiting for application startup.
INFO:     Application startup complete.

強(qiáng)烈建議您在本機(jī)編輯并運(yùn)行這些代碼。

只在有編輯器中輸入代碼時(shí)舒裤,您才能真正感受到 FastAPI 的優(yōu)勢(shì)喳资,體驗(yàn)到需要輸入的代碼到底有多少,還有類型檢查腾供、自動(dòng)補(bǔ)全等功能仆邓。


安裝 FastAPI

第一步是安裝 FastAPI。

學(xué)習(xí)本教程伴鳖,需要安裝所有可選依賴支持庫(kù):

$ pip install fastapi[all]

......上述命令還安裝了運(yùn)行 FastAPI 應(yīng)用的服務(wù)器 - uvicorn节值。

!!! note "筆記"

您可以單獨(dú)安裝各個(gè)支持庫(kù)。

需要把應(yīng)用部署到生產(chǎn)環(huán)境時(shí)榜聂,首先要安裝 FastAPI:

```
pip install fastapi
```

然后搞疗,還要安裝服務(wù)器 `uvicorn`:

```
pip install uvicorn[standard]
```

按需單獨(dú)安裝其它可選依賴支持庫(kù)。

高級(jí)用戶指南

學(xué)完用戶指南后须肆,您還可以繼續(xù)學(xué)習(xí)高級(jí)用戶指南匿乃。

高級(jí)用戶指南基于本指南,核心概念都一樣豌汇,但介紹了更多功能扳埂。

建議您先閱讀用戶指南

學(xué)完用戶指南就能開發(fā)完整的 FastAPI 應(yīng)用瘤礁。然后,再使用高級(jí)用戶指南中的功能擴(kuò)展應(yīng)用梅尤。

第一步

最簡(jiǎn)單的 FastAPI 文件所示如下:

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def root():
    return {"message": "Hello World"}

復(fù)制代碼到 main.py柜思。

運(yùn)行實(shí)時(shí)服務(wù)器:

$ uvicorn main:app --reload

INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [28720]
INFO:     Started server process [28722]
INFO:     Waiting for application startup.
INFO:     Application startup complete.

!!! note "筆記"

`uvicorn main:app` 命令說明如下:

* `main`:`main.py` 是 Python **模塊**;
* `app`:`main.py`  中 `app = FastAPI()` 創(chuàng)建的對(duì)象巷燥;
* `--reload`:代碼更新后赡盘,重啟服務(wù)器。僅在開發(fā)時(shí)使用缰揪。

輸出信息如下:

INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

這是 FastAPI 應(yīng)用在本機(jī)提供服務(wù)的 URL陨享。

查看文檔

打開瀏覽器訪問 http://127.0.0.1:8000葱淳。

JSON 響應(yīng)如下:

{"message": "Hello World"}

API 文檔

跳轉(zhuǎn)到 http://127.0.0.1:8000/docs

查看自動(dòng)生成的(Swagger UI)API 文檔:

Swagger UI

備選 API 文檔

跳轉(zhuǎn)到 http://127.0.0.1:8000/redoc抛姑。

查看自動(dòng)生成的(ReDoc)備選文檔 :

ReDoc

OpenAPI

FastAPI 使用 OpenAPI (定義 API 的標(biāo)準(zhǔn) )把所有 API 轉(zhuǎn)換成概圖赞厕。

概圖

概圖是對(duì)事物的定義與描述,不是實(shí)現(xiàn)功能的代碼定硝,只是抽象的描述皿桑。

API 概圖

本指南中,OpenAPI 是定義 API 概圖的規(guī)范蔬啡。

這里的概圖包括 API 路徑诲侮、路徑參數(shù)等。

數(shù)據(jù)概圖

概圖這一術(shù)語也指 JSON 等數(shù)據(jù)的結(jié)構(gòu)箱蟆。

本指南中沟绪,數(shù)據(jù)概圖是指 JSON 屬性、數(shù)據(jù)類型等空猜。

OpenAPI 和 JSON Schema

OpenAPI 用于定義 API 概圖绽慈。該概圖包含由 JSON Schema 為 API 發(fā)送與接收的數(shù)據(jù)所做的定義。JSON Schema 是 JSON 數(shù)據(jù)概圖標(biāo)準(zhǔn)抄肖。

查看 openapi.json

如果您對(duì) OpenAPI 原始概圖感興趣久信,F(xiàn)astAPI 自動(dòng)生成了描述所有 API 的 JSON (概圖)。

直接查看:http://127.0.0.1:8000/openapi.json漓摩。

JSON 文件的開頭如下:

{
    "openapi": "3.0.2",
    "info": {
        "title": "FastAPI",
        "version": "0.1.0"
    },
    "paths": {
        "/items/": {
            "get": {
                "responses": {
                    "200": {
                        "description": "Successful Response",
                        "content": {
                            "application/json": {
...

OpenAPI 是干什么用的

OpenAPI 概圖用于驅(qū)動(dòng) FastAPI 內(nèi)置的兩個(gè) API 文檔裙士。

基于 OpenAPI 的備選方案還有很多,為 FastAPI 應(yīng)用添加其它備選方案很容易管毙。

OpenAPI 還可以用于自動(dòng)生成和 API 通信的客戶端代碼腿椎。例如前端、移動(dòng)端夭咬、物聯(lián)網(wǎng)應(yīng)用等啃炸。

分步小結(jié)

第一步:導(dǎo)入 FastAPI

from fastapi import FastAPI

FastAPI 是為 API 提供所有功能的 Python 類。

!!! note "技術(shù)細(xì)節(jié)"

`FastAPI` 是直接繼承自 `Starlette` 的類卓舵。

`FastAPI` 可以調(diào)用 Starlette 的所有功能南用。

第二步:創(chuàng)建 FastAPI 實(shí)例

app = FastAPI()

變量 appFastAPI類實(shí)例

該實(shí)例是創(chuàng)建所有 API 的主要交互對(duì)象掏湾。

這個(gè) app 就是以下命令中由 uvicorn 引用的變量:

$ uvicorn main:app --reload

INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

如果用下面的代碼創(chuàng)建應(yīng)用:

my_awesome_api = FastAPI()

把代碼存入 main.py裹虫,要以如下方式調(diào)用 uvicorn

$ uvicorn main:my_awesome_api --reload

INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

第三步:創(chuàng)建路徑操作

路徑

路徑是指 URL 的第一個(gè)反斜杠(/)及它之后的內(nèi)容。

下列 URL 中:

https://example.com/items/foo

……路徑是:

/items/foo

!!! info "說明"

**路徑**通常也叫作**端點(diǎn)**或**路由**融击。

開發(fā) API 時(shí)筑公,路徑是分離 concernsresources 的主要方式。

操作

操作是指 HTTP 方法尊浪。

常用方法如下:

  • POST
  • GET
  • PUT
  • DELETE

罕見方法如下:

  • OPTIONS
  • HEAD
  • PATCH
  • TRACE

HTTP 協(xié)議支持使用上述任何一種(或多種)方法與路徑通信匣屡。


開發(fā) API 時(shí)封救,通常要使用特定 HTTP 方法執(zhí)行特定操作。

常用方法:

  • POST:創(chuàng)建數(shù)據(jù)
  • GET:讀取數(shù)據(jù)
  • PUT:更新數(shù)據(jù)
  • DELETE:刪除數(shù)據(jù)

OpenAPI 把 HTTP 方法稱為操作捣作。

我們也稱之為操作誉结。

定義路徑操作裝飾器

@app.get("/")

@app.get("/") 告訴 FastAPI 下方函數(shù)以如下方式處理訪問請(qǐng)求:

  • 請(qǐng)求路徑為 /
  • 使用 get 操作

!!! info "@decorator 說明"

`@something` 語法是 Python **裝飾器**。

就像一頂放在函數(shù)上面的裝飾帽(估計(jì)這個(gè)術(shù)語的命名就是這么來的)虾宇。

裝飾器接收下方函數(shù)搓彻,并用它執(zhí)行一些操作。

本例中嘱朽,這個(gè)裝飾器告訴 **FastAPI** 下方函數(shù)對(duì)應(yīng)的**路徑**是 `/` 及 `get` **操作**旭贬。

這就是***路徑操作裝飾器***。

其它常用操作如下:

  • @app.post()
  • @app.put()
  • @app.delete()

及罕見的操作:

  • @app.options()
  • @app.head()
  • @app.patch()
  • @app.trace()

!!! tip "提示"

您可以隨意使用任何操作(HTTP方法)搪泳。

**FastAPI** 不向操作強(qiáng)制附加任何特定含義稀轨。

本章中的說明僅是指導(dǎo),不是要求岸军。

例如奋刽,使用 GraphQL 時(shí),通常所有操作都只使用 `post` 一種方法艰赞。

第四步:定義路徑操作函數(shù)

路徑操作函數(shù)由以下幾部分組成:

  • 路徑/
  • 操作get
  • 函數(shù)裝飾器下方的函數(shù)(位于 @app.get("/") 下方)
async def root():

路徑操作函數(shù)就是 Python 函數(shù)佣谐。

FastAPI 每次接收使用 GET 方法訪問 URL/的請(qǐng)求時(shí)都會(huì)調(diào)用這個(gè)函數(shù)。

本例中的路徑操作函數(shù)是異步函數(shù)(async)方妖。


也可以不使用 async def狭魂,把路徑操作函數(shù)定義為普通函數(shù):

def root():

!!! note "筆記"

如果不清楚普通函數(shù)與異步函數(shù)的區(qū)別,請(qǐng)參閱異步:***等不及了党觅?***一節(jié)中的內(nèi)容雌澄。

第五步:返回內(nèi)容

return {"message": "Hello World"}

路徑操作函數(shù)可以返回字典列表杯瞻,以及字符串镐牺、整數(shù)等單值。

還可以返回 Pydantic 模型(稍后介紹)魁莉。

還有很多能自動(dòng)轉(zhuǎn)換為 JSON 的對(duì)象與模型(比如 ORM 等)睬涧。您可以嘗試使用最喜歡的對(duì)象,F(xiàn)astAPI 很可能已經(jīng)為其提供支持了旗唁。

小結(jié)

  • 導(dǎo)入 FastAPI
  • 創(chuàng)建 app 實(shí)例
  • 編寫路徑操作裝飾器(如 @app.get("/")
  • 編寫路徑操作函數(shù)(如 def root(): ...
  • 運(yùn)行開發(fā)服務(wù)器(如 uvicorn main:app --reload
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末畦浓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子逆皮,更是在濱河造成了極大的恐慌,老刑警劉巖参袱,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件电谣,死亡現(xiàn)場(chǎng)離奇詭異秽梅,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)剿牺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門企垦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人晒来,你說我怎么就攤上這事钞诡。” “怎么了湃崩?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵荧降,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我攒读,道長(zhǎng)朵诫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任薄扁,我火速辦了婚禮剪返,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘邓梅。我一直安慰自己脱盲,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布日缨。 她就那樣靜靜地躺著钱反,像睡著了一般。 火紅的嫁衣襯著肌膚如雪殿遂。 梳的紋絲不亂的頭發(fā)上诈铛,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音墨礁,去河邊找鬼幢竹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛恩静,可吹牛的內(nèi)容都是我干的焕毫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼驶乾,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼邑飒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起级乐,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤疙咸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后风科,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撒轮,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡乞旦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了题山。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兰粉。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖顶瞳,靈堂內(nèi)的尸體忽然破棺而出玖姑,到底是詐尸還是另有隱情,我是刑警寧澤慨菱,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布焰络,位于F島的核電站,受9級(jí)特大地震影響抡柿,放射性物質(zhì)發(fā)生泄漏舔琅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一洲劣、第九天 我趴在偏房一處隱蔽的房頂上張望备蚓。 院中可真熱鬧,春花似錦囱稽、人聲如沸郊尝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)流昏。三九已至,卻和暖如春吞获,著一層夾襖步出監(jiān)牢的瞬間况凉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工各拷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刁绒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓烤黍,卻偏偏與公主長(zhǎng)得像知市,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子速蕊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容