FastAPI(2)- 快速入門

小菠蘿測試筆記發表於2021-09-13

安裝 FastAPI

pip install fastapi

# 將來需要將應用程式部署到生產環境可以安裝 uvicorn 作為伺服器
pip install uvicorn

 

最簡單的程式碼栗子

from fastapi import FastAPI

app = FastAPI()


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

 

執行 uvicorn 命令,啟動伺服器

進到 py 檔案所屬目錄的命令列

uvicorn main:app --reload  
  • main:main.py 檔案(一個 Python「模組」)
  • app:在 main.py 檔案中通過 app = FastAPI() 建立的物件
  • --reload:讓伺服器在更新程式碼後自動重新啟動,僅在開發時使用該選項

 

我這裡截圖的名字換了哈

 

瀏覽器訪問

http://127.0.0.1:8000 

 

檢視互動式 API 文件

http://127.0.0.1:8000/docs

 

檢視可選的 API 文件

http://127.0.0.1:8000/redoc 

  

OpenAPI

FastAPi 使用 API 的 OpenAPI 標準為所有 API 生成 schema

 

schema

  • 是對事物的一種定義或描述
  • 它並非具體的實現程式碼,而只是抽象的描述
  • 後面會詳說

 

API Schema

  • OpenAPI 是一種規定如何定義 API Schema 的規範
  • 定義的 OpenAPI Schema 將包括 API 路徑,以及它們可能使用的引數等等
  • 比如:這個 API 的作用是什麼,需要必傳哪些引數,請求方法是什麼

 

Data Schema

  • 指的是某些資料比如 JSON 的結構
  • 它可以表示 JSON 的屬性及其具有的資料型別
  • 比如:某個屬性的資料型別是什麼,有沒有預設值,是不是必填,作用是什麼

 

JSON Schema

  • OpenAPI 會為 API 定義 API Schema,一般會包括 API 傳送和接收的資料的定義,比如:傳送的資料的型別、是否必填
  • 這些定義會以 JSON資料格式展示出來,所以都會稱為 JSON Schema

 

檢視 openapi.json

原始的 OpenAPI Schema,其實它只是一個自動生成的包含了所有 API 描述的 JSON 資料結構

http://127.0.0.1:8000/openapi.json 

 

拆分程式碼詳解

from fastapi import FastAPI

app = FastAPI()


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

將上面最簡單的栗子程式碼進行拆開詳解

 

第一步:匯入 FastAPI

from fastapi import FastAPI
  • FastAPI 是一個為 API 提供了所有功能的 Python ,必寫就對了
  • FastAPI 是直接從 Starlette 繼承的類,可以通過 FastAPI 使用所有的 Starlette 的功能

 

第二步:建立一個 FastAPI 例項

app = FastAPI()
  • app 就是 FastAPI 類的一個例項物件
  • 重點:app 將是建立所有 API 的主要互動物件
  • 要點:uvicorn 執行命令時也會用到 app
uvicorn main:app --reload

 

app 變數名換一下呢?

from fastapi import FastAPI


my_awesome_api = FastAPI()


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

 

那麼用 uvicorn 執行命令時也需要換

uvicorn main:my_awesome_api --reload

 

第三步:建立一個路徑操作

路徑

  • 指的是 URL 中從第一個 / 起的後半部分,即常說的 path
  • 比如:https://example.com/items/foo 的路徑就是/items/foo
  • 路徑也稱為:端點、路由

 

操作

就是 HTTP 請求方法

  • POST

  • GET

  • PUT

  • DELETE

  • OPTIONS

  • HEAD

  • PATCH

  • TRACE

在 HTTP 協議中,可以使用以上的其中一種(或多種)「方法」與每個路徑進行通訊

 

遵守 RESTFul 風格的話

通常使用: 

  • POST:建立資料
  • GET:讀取資料
  • PUT:更新資料
  • DELETE:刪除資料

 

定義一個路徑操作裝飾器

@app.get("/")

 

有兩點含義

  • 請求路徑為 /
  • 使用 get 請求

 

其他請求方法的裝飾器

  • @app.post()
  • @app.put()
  • @app.delete()
  • @app.options()
  • @app.head()
  • @app.patch()
  • @app.trace()

 

第四步:定義路徑操作函式

async def root():
  • 這就是一個普通的 Python 函式
  • 每當 FastAPI 接收一個使用 GET 方法訪問路徑為  / 的請求時這個函式會被呼叫
  • 在這個例子中,它是一個 async 函式(非同步處理函式,後面會細說)
# 也可以不加 async,就是個常規函式
def root():

 

第五步:函式返回內容

return {"message": "Hello World"}
  • 可以返回一個 dict、list,也可以是 str、int 單個值
  • 還可以返回 Pydantic 模型(後面詳解)
  • 還可以是其他會自動轉換為 JSON 的物件和模型(包括 ORM 物件等)

 

FastAPI 入門總結

編寫一個最簡單的 FastAPI 應用程式五部曲

  1. 匯入 FastAPI
  2. 建立一個 app 例項
  3. 編寫一個路徑操作裝飾器,如 @app.get("/") 
  4. 編寫一個路徑操作函式,如  def root(): ... 
  5. 執行開發伺服器,如  uvicorn main:app --reload