首頁>技術>

大概在10年前第一次接觸Python的Web開發框架Django之後,第一次覺得原來開發Web程式這麼簡單,只需要做一些很簡單的設計就可以啟動一個專案了,在那之前,我還短暫用過JAVA的SSH框架套裝。經過對比之後,覺得還是Django框架更適合快速開發程式。

然而一代新人換舊人,即使Django已經如此簡單了,我在有的時候還是會時不時的吐槽它(這玩意還是太過繁瑣了,我只需要寫一個簡單的介面服務,需要搞那麼多東西嗎?)

這種怨念特別是在Django有了DRF之後更加深了(Django REST framework),雖然它非常適合用來做前後端分離的介面服務程式,也足夠傻瓜化,不過我覺得還是太重了。

當然大而全本身也是Django的優點,我也沒啥好說的,它依然是我做Python相關的Web專案的首選。而Flask、Tornado之類的,老實說我覺得它們不像是一個框架,更像是某種腳手架或者“玩具”,玩具並不是貶義詞,事實上Flask和Tornado可以開發很正經的應用於生產環境的服務,不過它們在我眼裡,地位還是太尷尬了,打著輕量化框架的旗號,其實東西一點都不輕量。

於是尋找一種適合快速開發後端服務介面的框架擺上了我的日程,同樣也是我今天要學習的框架,FastAPI。

本章知識點:FastAPI簡介FastAPI安裝FastAPI第一個例子FastAPI自動文件介紹FastAPI簡介

現在Web應用都在搞前後端,單純的後端渲染的頁面的應用越來越少,也算是一種分工明細吧。而我對一個Web開發框架的要求已經變了,主要包含以下幾點。

框架結構簡單,開發快速。專為API介面設計、同時可以兼顧後端渲染。支援非同步。完備的ORM支援。支援中介軟體。方便的整合API文件服務。部署方便。生態豐富。

FastAPI這個框架進入我的視野應該是2019年了,不過一直沒認真了解過它。

直到最近因為工作需要調研一些新的開發框架時,只是閱讀了它的官方文件第一頁的範例,我就對它產生了興趣,因為它的設計思路真正契合了Python語言的思路(簡單就是美)。

以上是我對其感興趣的地方,它跟之前提到的Django、Flask、Tornado之類的不一樣,它其實是專為API服務而開發的,沒有那麼多歷史的包袱。

FastAPI安裝

FastAPI的安裝很簡單,pip直接搞定,不過需要注意的是最好同時安裝一下uvicorn,我們在開發階段開始就可以用uvicorn來作為web伺服器啟動FastAPI的程式。

pip install FastAPI
pip install uvicorn

安裝完畢後,隨手寫幾行程式碼來演示一下,檔案命名為main.py即可。

from fastapi import FastAPIapp = FastAPI()@app.get("/")def index():    return {"data": "hello world"}

寫完程式碼後,我們用剛才uvicorn安裝好的啟動一下服務。

uvicorn main:app --reload

這條命令的意思是用uvicorn啟動當前目錄下main.py這個檔案裡的app例項,加上reload的意思是檔案內容變更後自動重啟服務,便於開發除錯。

演示結果如下,用瀏覽器訪問本地迴環地址127.0.0.1加8000埠即可:

怎麼樣,寫一個API介面是不是很方便?現在我們來解析一下程式碼。

from fastapi import FastAPI 用於匯入 FastAPI類庫。app = FastAPI()用於例項化 FastAPI類,通常app這個變數會設定成全域性的,至少在當前模組作用域有效。@app.get("/")是一個裝飾器,在這裡的作用是將普通的Python函式變成一個get請求介面 ("/")表示url是根目錄主頁。至於函式裡的程式碼就很好理解了,定義了一個函式,然後return 了一個字典,表示介面被訪問時預設會返回一個JSON格式的資料回去(當然也可以return別的資料格式,例如字串、列表等)。FastAPI第一個例子

現在我們來寫一個稍微完整的例子,包含GET、POST、PUT方法的介面程式。

前面我們講到,可以用 @app.get("/")定義一個GET請求方法,那麼如何定義POST、PUT等請求方法呢?

最簡單的方法是下面這種,寫相同名稱的函式,用不同的裝飾器處理即可。

@app.get("/")def fun1():  return {}@app.post("/")def fun1():  return {}@app.put("/")def fun1():  return {}

如果嫌以上這種方法太麻煩,還有另外兩種更簡練的寫法。

@app.get("/")@app.post("/")@app.put("/")def fun1():  return {}
@app.api_route("/items/", methods=["get", "post", "put"])def items():    return {}

以上兩種方法都是可行的,不過需要做好針對不同的請求方法進行不同的處理,這部分知識我們以後再講。

現在我們先來定義一個GET方法並接受客戶端的請求引數,然後輸出到頁面上。

from fastapi import FastAPIapp = FastAPI()@app.get("/items/")def items(item_id, q):    return {        "item_id": item_id,        "q": q    }

這個例子很簡單,items這個介面接受了客戶端兩個引數的值:item_id和q。然後作為一個 JSON格式的資料把這兩個值返回給客戶端。

需要注意的是,如果我們在 items函式裡定義了item_id和q這兩個引數名之後,那麼這兩個引數在瀏覽器上是必須要傳的,缺一不可,否則就會提示缺少引數。

以上就是引數缺少一個的時候FastAPI自動爆出來的錯誤資訊。

如果我們需要讓某些引數變成非必填項的話,可以這樣函式的引數設定一個預設值為None。

現在items這個介面的引數就可以接受非必填的情況了。

FastAPI自動文件介紹

最後說說關於文件自動生成這一塊,很多後端程式設計師寫完程式後都懶得寫介面文件,或者是介面經常發生變化,來不及更新文件,最初都是程式手寫文件,還需要考慮各種排版和格式問題。前幾年有像swagger之類的工具出現,大家可以在程式碼裡定義好註釋,然後swagger可以自動幫我們生成一個介面文件服務,提供給別人檢視和測試。

到現在,FastAPI甚至連註釋也不讓我們寫了,直接就根據已知的介面生成文件(基於swagger或其他工具),讓程式設計師可以越來越懶。

我們直接訪問/docs這個地址即可檢視自動生成好的介面文件。

總結:

關於FastAPI的初步介紹就到這,之後我會根據我的學習程序給大家講解更多關於FastAPI的東西。歡迎持續關注這個專題。

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 神一樣的操作,真的牛逼了!Android Jetpack Compose 最全上手指南