FastAPI 構建 API 服務,究竟有多快?
- 2020 年 3 月 4 日
- 筆記
FastAPI 幹啥的?
FastAPI 是用來構建 API 服務的一個高性能框架。
為什麼選擇 FastAPI ?
FastAPI 是一個現代、高性能 web 框架,用於構建 APIs,基於 Python 3.6 及以上版本。
最大特點:快!性能極高,可與 NodeJS, Go 媲美。
基於 Starlette 和 Pydantic,是 FastAPI 如此高性能的重要原因。
還具備代碼復用性高,容易上手,健壯性強的優點。
個人還覺得,FastAPI 還有一個非常強的優勢:方便的 API 調試,生成 API 文檔,直接能夠做到調試自己構建的 API,這在實際應用中,價值凸顯。
FastAPI 這麼強悍,有必要研究和使用,因為無論做開發,還是做算法,API 服務真的太重要,太重要,尤其是大廠,離不開 API 接口。
Pydantic 做類型強制檢查
FastAPI 基於 Pydantic
,Pydantic
主要用來做類型強制檢查。參數賦值,不符合類型要求,就會拋出異常。
對於 API 服務,支持類型檢查非常有用,會讓服務更加健壯,也會加快開發速度,因為開發者再也不用自己寫一行一行的做類型檢查。
首先 pip install pydantic
然後,使用 Pydantic 做強制類型檢查。
from pydantic import ValidationError from datetime import datetime from typing import List from pydantic import BaseModel class User(BaseModel): id:int name='jack guo' signup_timestamp: datetime = None friends: List[int] = []
觀察到:
- id 要求必須為 int
- name 要求必須為 str, 且有默認值
- signup_timestamp 要求為 datetime, 默認值為 None
- friends 要求為 List,元素類型要求 int, 默認值為 []
使用 User 類:
try: User(signup_timestamp='not datetime',friends=[1,2,3,'not number']) except ValidationError as e: print(e.json())
id
沒有默認值,按照預期會報缺失的異常
signup_timestamp
被賦為非 datetime 類型值,按照預期會報異常
friends
索引為 3 的元素被賦值為 str,按照預期也會報異常
執行代碼,驗證是否符合預期。
執行結果顯示,符合預期
[ { "loc": [ "id" ], "msg": "field required", "type": "value_error.missing" }, { "loc": [ "signup_timestamp" ], "msg": "invalid datetime format", "type": "value_error.datetime" }, { "loc": [ "friends", 3 ], "msg": "value is not a valid integer", "type": "type_error.integer" } ]
快速上手 FastAPI
這是一個入門 demo, 構建以下三個路由:
from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class User(BaseModel): id: int name: str friends: list @app.get("/") def index(): return {"admin": "welcome to FastAPI"} @app.get("/users/{user_id}") def read_user(user_id: int, name: str = None): return {"user_id": user_id, "name": name} @app.put("/users/{user_id}") def update_user(user_id: int, user: User): return {"user_name": user.name, "user_id": user_id}
將上述代碼保存為 main.py
再安裝與構建服務相關的框架 uvicorn
安裝完成後,後台執行:uvicorn main:app --reload
啟動服務,顯示如下:
打開客戶端,輸入:localhost:8000,回車:
輸入請求:localhost:8000/users/5,回車,看到前台數據,非常容易的就能傳遞到 controller 層,方便。
輸入請求:localhost:8000/docs,回車:,看到 API 文檔界面
點開第二個 get 請求,然後點擊 Try it out 後,便可以進行接口調試。非常方便!
輸入user_id, name 後,點擊 Execute,執行成功。如果 user_id 輸入非數值型,點擊 Execute 後,紅框閃動一下,不會執行,直到輸入正確為止。
輸入user_id, name 後,點擊 Execute,
能看到結果,包括請求的 URL
也能看到,服務器響應前端,返回的結果:
FastAPI 基於以上這些強大的優點,相信在實際開發 API 服務時,會很敏捷。期待!