FastAPI 簡介

FastAPI 與Flask相似,都是Python Web RestfulAPI框架。但FastAPI有著最快的運行速度,可以大幅降低server/clinet端的效能負載。其中最讓我印象深刻的是自帶的/docs介面,在開發與測試階段省了不少功夫,要不然開發傳統API時還需要開著PostMan輸入參數發送請求(我不是想表達PostMan不好用,只是想說明可以省略很多步驟),FastAPI框架本身就自帶了Docs的測試頁面,真的是相當的親民。最後,FastAPI也支援了非同步處理流程(Async),實實在在的與現代的開發趨勢接軌。總結來說,FastAPI 有著快速的運行效率,直覺簡潔的語法,還有自帶的Docs文件介面,是一個學習曲線相當低的一個框架。

安裝

那要如何安裝呢?? ps. 所有套件強烈安裝在虛擬環境中!!!或是直接往下看docker中的說明,在container中操作!!!! 首先要安裝所需要的套件,在命令列中輸入以下:

pip install fastapi
pip install uvicorn

unicorn是一個ASGI伺服器(異步服務器網端口),顧名思義是因為需要支援FastAPI異步處理的需求。而題外話說明ASGI作為Web Sever Gateway Interface(WSGI)的繼承者,其中WSGI定義了web server 和 python web application之間的溝通規範(python web application 不能直接運行在傳統的Web Server上,如NGINX, APACHE, IIS等)。

Hello FastAPI

安裝完成了需要的套件,我們來實作第一個應用程式! 在VS Code編譯器中建立 main.py (在熟悉語法規則後檔名可以自訂!!!)

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello": "FastAPI"}

以上的程式碼建立了一個簡單的FastAPI應用程式,當輸入以下指令:

uvicorn main:app --reload

便會運行應用程式,並在瀏覽器中應用程式的根目錄“/”呈現一個JSON格式的內容{"Hello","FastAPI"} Alt text 在這裡是透過uvicorn 建立ASGI的伺服器來啟動python 程式,其中“--reload”則代表在修改程式碼後會自動更新夜程式與頁面,而不需要重新執行程式!!

Get

FastAPI 有著極為直覺的特性,restful的方法也只要以下面形式展現即可.在main.py中加入下面這段程式碼:

@app.get("/page/{id}")
def get_page(id):
    return {"data":f"Page的ID是:{id}"}

在程式碼中,我們設置了一個路徑參數id,在網頁中輸入 http://127.0.0.1:8000/page/4 ,會得到以下結果。

Alt text

這只是最粗淺的應用,還有很多包括判斷型別,預設定義值,甚至改成post方法等等,詳細的介紹可以參考下面的reference 連結,這裡就不多著墨了。

Query Parameter

和所有的request一樣,如果要傳遞參數會透過("?"與“&”)等符號輸入key,瀏覽的網址範例如下:

http://127.0.0.1:8000/articles/all?page=2&page_size=10

在main.py程式碼中輸入

@app.get("/articles/all")
def get_blogs_all(page, page_size):
    return {"message": f"所有的 articles: 來自第 {page} 頁, 總共有 {page_size} 筆資料"}

上面的requests輸入了page=2和page_size=10,因此在瀏覽器上顯示了先前輸入的變數!!!

{"message":"所有的 articles: 來自第 2 頁, 總共有 10 筆資料"}

ps. 若讀者的環境是mac和safari的瀏覽器,會因為預設的編碼問題而出現中文亂碼的情形,因此可以修改這行,強制改成Json格式與設定其utf-8編碼!

return JSONResponse({"message": f"所有的 articles: 來自第 {page} 頁, 總共有 {page_size} 筆資料"},headers={"content-type":"application/json;charset=utf-8"})

FastAPI Docs

講完了FastAPI最最基礎的應用後,還有一個我個人認為與目前市面上python web 框架最大的差別--fastapi自帶的Docs測試工具!!! 在網址中輸入“ http://127.0.0.1:8000/docs ”,會出現關於你設計的api 測試工具!大大改善了以往需要利用postman等第三方的工具進行測試的缺點。

Alt text

點擊"try it out",便可以在swager UI 中輸入parameter進行測試!

Alt text

Docker 簡介

Docker 是一個服務虛擬化的一大工具,藉由將程式在容器(Container)內運行,可以避免不同OS系統、不同測試虛擬環境、甚至不同package版本造成衝突的問題。

Alt text (來源:《Docker —— 從入門到實踐­》正體中文版)

如上圖,不需要如建置傳統虛擬機的流程,在hostos上切分並灌進guestos。docker以輕量化的docker engine作為基底媒介,就可以達成跨系統的服務容器化目的。詳細的介紹網路上有相當多的資源可以參考,也可以參考下方的reference,這邊我就不獻醜了,我只挑幾個執行的必要功能進行概略介紹而已。

Dockerfile

Dockek的實作流程主要是以dockerfile建立映像檔(image),再執行映像檔並實體化包裝好的服務。(當然複雜一點的服務可能會使用docker-compose 進行,但這裡只是舉一個簡單的例子說明,docker-compose的方法就不多著墨了)。那在這裡dockerfile的功用就是定義好該服務所執行的環境包括執行的語言、版本、需要的安裝packages、甚至需要啟動程式的CMD命令等等,將這些環境相關的“設定檔”設定完成,就可以build一個image,在run這個image,就完成docker的虛擬化了!! 以下提供一個簡單的dockerfile,網路上有相當多的範本可以參考,若不想動腦研究dockerfile設定的語法,無腦copy paste 就對了。

FROM python:3.11-slim
ENV PYTHONUNBUFFERED True
ENV APP_HOME /app
WORKDIR $APP_HOME
COPY . ./

RUN pip install --upgrade pip
COPY requirements.txt .
RUN pip install -r requirements.txt

EXPOSE 8080

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"]

在這裡,別忘了輸出requirements.txt的環境,把requirements.txt檔案放在根目錄即可,requirements.tex至少要下面這兩個喔,其他packages就看個人需求了。

requirements
fastapi
uvicorn

接下來,在命令視窗執行這兩行,“docker build”是建立名為fast_app的image檔,而“docker run” 則是在容器(container)中執行fastapi_app的映像檔,並暴露container的8080端口(port)到本機(localhost)的80端口,在這裡我故意用不同的端口對接,讓讀者可以了解命令的設定意義。

docker build -t fastapi_app .
docker run -p 80:8080  fastapi_app

在本機的瀏覽器中網址輸入 “ localhost:80 ” 便可以在瀏覽器中訪問該API!!!

Google Cloud Run 簡介

到這裡,你已經學會如何在容器化一個python API服務。但到底要如何將API對外服務呢??最簡單的方式是用ngrok將local的port對外生成一個https的網址,但這個方式終究只適合開發測試階段,不適合長究服務;再來的方法就是去搞一台server,在伺服器上部署該服務(如果只是部署單一程式,不一定要容器化,也可以直接對server的環境設定),但這樣一來除了要想辦法去生一個對外服務的域名,申請SLL認證以達成https協定等麻煩的流程,最麻煩的是要維護該伺服器主機,我想大部分的初階開發者應該都沒有財力/能力可以維護server吧! 因此Google(GCP)、Amazon(AWS)、Microsoft(Azure)等大廠都推出了自己的雲端平台以解決上述自營伺服器的困擾。這裡提供一個雲端部署的解決方案,Google Cloud Platform (GCP) 中的 Google Cloud Run (GCR),這個只是眾多雲端服務中的一種,其他平台也有類似的解決方案,這裡我就不細講了,其實只是我沒研究,也沒碰過XDD

gcloud 部署

部署到Google Cloud Run 理所當然的需要註冊google 帳號,也要設定一些GCP的服務與付費帳戶等(有免費額度),這裡我就不細講了,一些通用的設定可以參考前幾篇google analytics API 使用教學

處理完了非開發相關的帳戶問題,接下來需要安裝gcloud command line。前往Google Cloud SDK 官方網站下載你對應作業系統的安裝檔案。接著安裝Cloud SDK,安裝完成後,在終端或命令提示字元中輸入 gcloud --version 檢查安裝是否成功。可以透過以下的命令進行gcloud的基礎設定:

gcloud 基礎設定

  • gcloud init:初始化 gcloud CLI,該指令會提示登錄 Google 帳戶,並選擇您要使用的 GCP 項目。
  • gcloud config set project PROJECT_ID:設定 GCP Project ID,以便 gcloud CLI 與該項目交互使用。
  • gcloud auth login:登錄 Google 帳戶。

也可以直接執行此行將容器化的服務部署上雲,當然如果直接執行話可能會跳出視窗叫你登樹google帳號之類的流程。透過執行這行,將會在GCR上建立一個名為fast-app的服務。

gcloud run deploy fastapi-app --source .

Alt text

選擇"[2] asia-east1"台灣的機房(當然可以依照不同需求,選擇其他國家/地區的機房拉,但理論上在台灣的話部署同一個地區的機房伺服器會最快呦)。跑完所有流程沒有報錯就部署完成了!!可以透過命令提示視窗或是GCR的平台查看生成好的連結喔~

Alt text

到這裡各位就已經學會了要如何建立fastapi的服務,並將其容器化上雲對外服務了。當然這只是最最最最基礎的應用教學,但也足以延伸出其他小應用了,例如部署linebot的程式等等,之後有機會再來分享。

boba-icon
請我喝珍奶!