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