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