上一篇我們讓 Flask 回傳 JSON 資料:
@app.route('/tasks')
def tasks():
return {
"name": "Flask",
"completed": False
}
當 Request(請求)來到 /tasks,Flask 會執行對應的程式,把 Python 字典轉成 JSON,再透過 Response 回傳。
做到這裡其實代表:
只使用 Flask,本身就已經可以建立 API。
那為什麼還會看到 Flask-RESTX、Flask-RESTful 這些東西呢?
現在我們的程式還很簡單,只有像 /tasks 這樣少數幾個 Path。
但之後 API 慢慢變多例如:
GET /tasks
POST /tasks
PUT /tasks/1
DELETE /tasks/1
除了不同的 API 功能之外,我們可能還需要檢查傳進來的資料、整理回傳的資料,或建立 API 文件。
這些事情其實都可以自己使用 Flask 來處理。
但是為了讓開發 API 更方便,我們也可以在 Flask 上加入一些額外的工具。
Flask 可以完成這些工作,而其他套件則是提供更多現成的功能,不用全部都自己處理。
這裡要先講清楚一件事:
接下來介紹的這些,都是 Flask 的「擴充套件」,不是用來取代 Flask 的。
底下跑的還是 Flask,只是多了一些幫我們整理 API 的工具。
接下來簡單認識幾個可能會看到的工具。
Flask-RESTful 是用來幫助我們建立 REST API 的 Flask 擴充套件。
前面我們使用 Flask 時是這樣:
@app.route('/tasks')
def tasks():
return "My Tasks"
而 Flask-RESTful 會使用 Resource 的方式來組織 API,例如:
class Tasks(Resource):
def get(self):
return {"message": "取得作業"}
def post(self):
return {"message": "新增作業"}
api.add_resource(Tasks, '/tasks')
可以注意最後那一行。
Flask-RESTful 是另外用 add_resource() 來設定路徑,跟我們之後要用的 Flask-RESTX 寫法不太一樣 Flask-RESTX 常見的是使用 @api.route() 來設定 Resource 的路徑,看教學的時候不要搞混了。
Flask-RESTX 也是用來幫助我們建立 REST API 的 Flask 擴充套件。
它同樣可以使用 Resource 來整理 API,例如之後會看到:
@api.route('/tasks')
class Tasks(Resource):
def get(self):
return {"message": "取得作業"}
但 Flask-RESTX 還提供了一些開發 API 時很方便的功能,例如可以產生 Swagger / OpenAPI API 文件,也有資料模型、輸入驗證與輸出格式化等工具。
所以我們後面的練習會選擇 Flask-RESTX。
不過現在不用急著理解 Resource、Api、@api.route()。
Day 11 我們才會正式安裝 Flask-RESTX,再一個一個看它們是什麼。
APIFlask 也是一個以 Flask 生態為基礎、專門讓建立 Web API 更方便的工具。
它也提供像是資料驗證、API 文件等功能。
我們這次不會使用它,所以目前先知道它也是 Flask 生態中建立 API 的一種選擇就可以了。
Flasgger 的方向又有一點不一樣。
它主要是幫 Flask 加入 Swagger / OpenAPI 文件相關功能。
簡單來說,之後我們建立很多 API 時,如果只有看到:
GET /tasks
POST /tasks
PUT /tasks/1
可能不容易知道每個 API 要傳什麼資料、會回傳什麼。
API 文件就是用來把這些資訊整理出來。
而 Swagger 還可以提供網頁介面,讓我們查看、測試 API。
我們後面使用 Flask-RESTX 時,也會看到類似的 API 文件,所以現在先知道 Swagger 大概是做什麼的就好。
套件 主要在做的事 內建 API 文件 這次用不用
只用 Flask 路由、回傳 Response,什麼都能做 沒有 用(底層)
Flask-RESTful 用 Resource 整理 REST API 沒有 不用
Flask-RESTX 用 Resource 整理 API + 資料模型 + 驗證 有(Swagger) 用
APIFlask 建立 Web API,資料驗證、文件 有 不用
Flasgger 幫 Flask 加上 Swagger 文件 有 不用
可以發現它們其實有點重疊,差別在於「幫你做到哪裡」。
這次 30 天主要會使用:
Flask-RESTX
不是因為 Flask 不能寫 API,而是 Flask-RESTX 已經提供了一些接下來會用到的功能:
用 Resource 把同一個路徑的 GET、POST 整理在一起
內建 Swagger,不用另外裝套件就有 API 文件可以測試
有資料模型(Model)可以描述輸入和輸出
之後要做輸入驗證的時候也用得到
另外,Flask-RESTX 也不是唯一的選擇。
現在建立 Python Web API 還有 APIFlask、FastAPI 等不同工具,各自的設計方式和功能也不太一樣。
不過對現在的我來說,Flask-RESTX 可以讓我一邊練習 REST API,一邊透過 Swagger 直接看到並測試自己建立的 API,所以這次就先從 Flask-RESTX 開始。
只用 Flask 就可以寫 API
其他套件是「擴充」,不是取代 Flask
這些套件的差別大多在「幫你做到哪裡」
這次會使用 Flask-RESTX
下一篇就要正式安裝 Flask-RESTX,把今天一直提到的 Api、Resource、@api.route() 實際寫出來,
建立第一個 Flask-RESTX 的 API。