最簡(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.
?uvicorn main:app
? 命令含義如下:
- ?
main
?:?main.py
? 文件(一個(gè) Python「模塊」)。
- app:在 ?
main.py
? 文件中通過(guò)?app = FastAPI()
? 創(chuàng)建的對(duì)象。
- ?
--reload
?:讓服務(wù)器在更新代碼后重新啟動(dòng)。僅在開(kāi)發(fā)時(shí)使用該選項(xiàng)。
在輸出中,會(huì)有一行信息像下面這樣:
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
該行顯示了你的應(yīng)用在本機(jī)所提供服務(wù)的 URL 地址。
打開(kāi)瀏覽器訪問(wèn) http://127.0.0.1:8000。
你將看到如下的 JSON 響應(yīng):
{"message": "Hello World"}
交互式 API 文檔
跳轉(zhuǎn)到 http://127.0.0.1:8000/docs。
你將會(huì)看到自動(dòng)生成的交互式 API 文檔(由 Swagger UI 提供):
前往 http://127.0.0.1:8000/redoc。
你將會(huì)看到可選的自動(dòng)生成文檔 (由 ReDoc 提供):
FastAPI 使用定義 API 的 OpenAPI 標(biāo)準(zhǔn)將你的所有 API 轉(zhuǎn)換成「模式」。
「模式」是對(duì)事物的一種定義或描述。它并非具體的實(shí)現(xiàn)代碼,而只是抽象的描述。
在這種場(chǎng)景下,OpenAPI 是一種規(guī)定如何定義 API 模式的規(guī)范。
定義的 OpenAPI 模式將包括你的 API 路徑,以及它們可能使用的參數(shù)等等。
「模式」這個(gè)術(shù)語(yǔ)也可能指的是某些數(shù)據(jù)比如 JSON 的結(jié)構(gòu)。
在這種情況下,它可以表示 JSON 的屬性及其具有的數(shù)據(jù)類(lèi)型,等等。
OpenAPI 為你的 API 定義 API 模式。該模式中包含了你的 API 發(fā)送和接收的數(shù)據(jù)的定義(或稱(chēng)為「模式」),這些定義通過(guò) JSON 數(shù)據(jù)模式標(biāo)準(zhǔn) JSON Schema 所生成。
openapi.json
?如果你對(duì)原始的 OpenAPI 模式長(zhǎng)什么樣子感到好奇,其實(shí)它只是一個(gè)自動(dòng)生成的包含了所有 API 描述的 JSON。
你可以直接在:http://127.0.0.1:8000/openapi.json 看到它。
它將顯示以如下內(nèi)容開(kāi)頭的 JSON:
{
"openapi": "3.0.2",
"info": {
"title": "FastAPI",
"version": "0.1.0"
},
"paths": {
"/items/": {
"get": {
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
...
OpenAPI 的用途
驅(qū)動(dòng) FastAPI 內(nèi)置的 2 個(gè)交互式文檔系統(tǒng)的正是 OpenAPI 模式。
并且還有數(shù)十種替代方案,它們?nèi)慷蓟?OpenAPI。你可以輕松地將這些替代方案中的任何一種添加到使用 FastAPI 構(gòu)建的應(yīng)用程序中。
你還可以使用它自動(dòng)生成與你的 API 進(jìn)行通信的客戶(hù)端代碼。例如 web 前端,移動(dòng)端或物聯(lián)網(wǎng)嵌入程序。
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
FastAPI 是一個(gè)為你的 API 提供了所有功能的 Python 類(lèi)。
技術(shù)細(xì)節(jié)
FastAPI 是直接從 Starlette 繼承的類(lèi)。
你可以通過(guò) FastAPI 使用所有的 Starlette 的功能。
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
這里的變量 app 會(huì)是 FastAPI 類(lèi)的一個(gè)「實(shí)例」。
這個(gè)實(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)用:
from fastapi import FastAPI
my_awesome_api = FastAPI()
@my_awesome_api.get("/")
async def root():
return {"message": "Hello World"}
將代碼放入 ?main.py
?文件中,然后你可以像下面這樣運(yùn)行 uvicorn:
uvicorn main:my_awesome_api --reload
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
這里的「路徑」指的是 URL 中從第一個(gè)? /
? 起的后半部分。
所以,在一個(gè)這樣的 URL 中:
?https://example.com/items/foo
?
...路徑會(huì)是:
?/items/foo
?
「路徑」也通常被稱(chēng)為「端點(diǎn)」或「路由」。
開(kāi)發(fā) API 時(shí),「路徑」是用來(lái)分離「關(guān)注點(diǎn)」和「資源」的主要手段。
這里的「操作」指的是一種 HTTP「方法」。
下列之一:
POST
?GET
?PUT
?DELETE
?...以及更少見(jiàn)的幾種:
OPTIONS
?HEAD
?PATCH
?TRACE
?在 HTTP 協(xié)議中,你可以使用以上的其中一種(或多種)「方法」與每個(gè)路徑進(jìn)行通信。
在開(kāi)發(fā) API 時(shí),你通常使用特定的 HTTP 方法去執(zhí)行特定的行為。
通常使用:
因此,在 OpenAPI 中,每一個(gè) HTTP 方法都被稱(chēng)為「操作」。
我們也打算稱(chēng)呼它們?yōu)椤覆僮鳌埂?/p>
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
?@app.get("/")
? 告訴 FastAPI 在它下方的函數(shù)負(fù)責(zé)處理如下訪問(wèn)請(qǐng)求:
/
?get
? 操作?@decorator
?
?@something
? 語(yǔ)法在 Python 中被稱(chēng)為「裝飾器」。
像一頂漂亮的裝飾帽一樣,將它放在一個(gè)函數(shù)的上方(我猜測(cè)這個(gè)術(shù)語(yǔ)的命名就是這么來(lái)的)。
裝飾器接收位于其下方的函數(shù)并且用它完成一些工作。
在我們的例子中,這個(gè)裝飾器告訴 FastAPI 位于其下方的函數(shù)對(duì)應(yīng)著路徑?/
?加上?get
?操作。
它是一個(gè)「路徑操作裝飾器」。
你也可以使用其他的操作:
@app.post()
?@app.put()
?@app.delete()
?以及更少見(jiàn)的:
@app.options()
?@app.head()
?@app.patch()
?@app.trace()
?您可以隨意使用任何一個(gè)操作(HTTP方法)。
FastAPI 沒(méi)有強(qiáng)制要求操作有任何特定的含義。
此處提供的信息僅作為指導(dǎo),而不是要求。
比如,當(dāng)使用 GraphQL 時(shí)通常你所有的動(dòng)作都通過(guò) ?post
?一種方法執(zhí)行。
這是我們的「路徑操作函數(shù)」:
/
?。get
?。@app.get("/")
? 下方)。from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
這是一個(gè) Python 函數(shù)。
每當(dāng) FastAPI 接收一個(gè)使用 ?GET
?方法訪問(wèn) URL「?/
?」的請(qǐng)求時(shí)這個(gè)函數(shù)會(huì)被調(diào)用。
在這個(gè)例子中,它是一個(gè) ?async
?函數(shù)。
你也可以將其定義為常規(guī)函數(shù)而不使用 ?async def:
?
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def root():
return {"message": "Hello World"}
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
你可以返回一個(gè) ?dict
?、?list
?,像 ?str
?、?int
?一樣的單個(gè)值,等等。
你還可以返回 Pydantic 模型(稍后你將了解更多)。
還有許多其他將會(huì)自動(dòng)轉(zhuǎn)換為 JSON 的對(duì)象和模型(包括 ORM 對(duì)象等)。嘗試下使用你最喜歡的一種,它很有可能已經(jīng)被支持。
FastAPI
?。app
?實(shí)例。@app.get("/")
?)。 def root(): ...
?)。uvicorn main:app --reload
?)。
掃描下方二維碼或打開(kāi)微信搜一搜“w3cschool編程獅”關(guān)注公眾號(hào)回復(fù)關(guān)鍵詞【Python123】或者【Python資料包】免費(fèi)領(lǐng)取 Python 學(xué)習(xí)資料,包含軟件安裝包,電子書(shū)、思維導(dǎo)圖等
更多建議: