FastAPI教程 第一步

2022-04-24 18:47 更新

最簡單的 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 提供):

Swagger UI

可選的 API 文檔

前往 http://127.0.0.1:8000/redoc

你將會看到可選的自動生成文檔 (由 ReDoc 提供):

ReDoc

OpenAPI

FastAPI 使用定義 API 的 OpenAPI 標準將你的所有 API 轉(zhuǎn)換成「模式」。

「模式」

「模式」是對事物的一種定義或描述。它并非具體的實現(xiàn)代碼,而只是抽象的描述。

API「模式」

在這種場景下,OpenAPI 是一種規(guī)定如何定義 API 模式的規(guī)范。

定義的 OpenAPI 模式將包括你的 API 路徑,以及它們可能使用的參數(shù)等等。

數(shù)據(jù)「模式」

「模式」這個術語也可能指的是某些數(shù)據(jù)比如 JSON 的結(jié)構(gòu)。

在這種情況下,它可以表示 JSON 的屬性及其具有的數(shù)據(jù)類型,等等。

OpenAPI 和 JSON Schema

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)嵌入程序。

分步概括

步驟 1:導入 FastAPI

from fastapi import FastAPI

app = FastAPI()


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

FastAPI 是一個為你的 API 提供了所有功能的 Python 類。

技術細節(jié)

FastAPI 是直接從 Starlette 繼承的類。

你可以通過 FastAPI 使用所有的 Starlette 的功能。

步驟 2:創(chuàng)建一個 FastAPI「實例」

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)

步驟 3:創(chuàng)建一個路徑操作

路徑

這里的「路徑」指的是 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í)行特定的行為。

通常使用:

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

因此,在 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í)行。

步驟 4:定義路徑操作函數(shù)

這是我們的「路徑操作函數(shù)」:

  • 路徑:是 ?/?。
  • 操作:是 ?get?。
  • 函數(shù):是位于「裝飾器」下方的函數(shù)(位于 ?@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"}

步驟 5:返回內(nèi)容

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)被支持。

總結(jié)

  • 導入 ?FastAPI?。
  • 創(chuàng)建一個 ?app ?實例。
  • 編寫一個路徑操作裝飾器(如 ?@app.get("/")?)。
  • 編寫一個路徑操作函數(shù)(如上面的? def root(): ...?)。
  • 運行開發(fā)服務器(如 ?uvicorn main:app --reload?)。


領取免費資料

掃描下方二維碼或打開微信搜一搜“w3cschool編程獅”關注公眾號回復關鍵詞【Python123】或者【Python資料包】免費領取 Python 學習資料,包含軟件安裝包,電子書、思維導圖等

w3cschool編程獅微信公眾號

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號