上一篇我們認識了幾個可以幫助 Flask 開發 API 的套件。
Flask 本身就可以建立 API,但是也可以搭配一些套件,讓開發和整理 API 更方便。
今天就來正式使用 Flask-RESTX!
前面我們已經安裝過 Flask,現在要再安裝 Flask-RESTX。
在終端機輸入(記得要先啟動虛擬環境):
pip install flask-restx==1.3.2
裝好之後可以確認一下版本:
pip show flask-restx

安裝完成後,先來建立一個簡單的 API:
app.py
from flask import Flask
from flask_restx import Api, Resource
app = Flask(__name__)
api = Api(app)
@api.route('/tasks')
class Tasks(Resource):
def get(self):
return {
"name": "Flask",
"completed": False
}
if __name__ == '__main__':
app.run(debug=True)
今天的 app.py 是「整份重寫」的,裡面沒有 Day 8 寫的:
@app.route('/')
def hiiiii():
return "Hi Flask!"
如果直接在舊的檔案上面加 Flask-RESTX,記得要把這一段拿掉。
因為 Flask-RESTX 預設會把 Swagger API 文件放在 / 這個路徑(Day 12 就會用到),
如果 / 已經被我們自己的 Route 佔走了,打開 http://127.0.0.1:5000/ 就只會看到 Hi Flask!,
會以為 Swagger 沒有出現。
我自己就是這樣卡了一下,所以先提醒一下。
跟前幾天寫的 Flask 程式比起來,多了一些新的東西。
跟前面使用 Flask 一樣,安裝完套件後,如果想要在這個程式中使用裡面的東西,就需要先匯入
from flask import Flask
from flask_restx import Api, Resource
第一行是從 flask 中匯入 Flask
第二行就是從 Flask-RESTX 中匯入等等會用到的 Api 和 Resource
接著:
app = Flask(__name__)
是建立 Flask 物件並存進 app 這個變數
api = Api(app)
把剛剛建立的 Flask app 傳給 Api,建立一個和 Flask app 連接的 Api 物件,並存進 api 這個變數
所以我們現在還是在使用 Flask,只是多了 Flask-RESTX 提供的功能來幫助我們開發。
前面已經建立了 api 這個 Api 物件,所以現在使用 Flask-RESTX 設定 API 路徑
可以使用
@api.route('/tasks')
設定 /tasks 這個 Path
在前面 Flask 是用
@app.route('/tasks')
接著會看到:
class Tasks(Resource):
Resource 是 Flask-RESTX 提供的一個類別,
這裡建立了一個叫做 Tasks 的類別,來整理 /tasks 這個 API 要處理的程式。
這裡有兩個一開始會誤會的地方:
第一,class 的名字跟 Path 沒有關係。
我們把它叫做 Tasks,只是因為它在處理作業。
就算改成 class Abc(Resource),只要 @api.route(‘/tasks’) 沒變,路徑一樣是 /tasks。
真正決定路徑的是上面的 @api.route()。
第二,裡面的 method 名稱不能亂取。
def get(self):
是用來處理 GET Request
所以 /tasks 收到 GET Request 時,就會執行 get() 裡面的程式,最後回傳。
Flask-RESTX 是直接用 method 的名字去對應 HTTP Method 的,而且要小寫。
寫成 def GET(self) 或 def getTask(self) 都不會被當成 GET 來處理。
如果之後還要處理 POST,也可以在同一個 Tasks 裡加入
def post(self):
這樣 GET Request 會交給 get(),POST Request 會交給 post(),不同的 HTTP Method 就可以整理在一起。
這也是 Day 10 說的:用 Resource 把同一個路徑的不同 Method 收在一起。
接下來就執行它
python app.py
打開
瀏覽器會對 /tasks 發出 GET Request。
Flask-RESTX 找到 /tasks 對應的 Resource,
因為這次是 GET Request,所以會執行 get()
python
def get(self):
return {
"name": "Flask",
"completed": False
}
回傳
{
"name": "Flask",
"completed": false
}
瀏覽器打開 /tasks 看到 JSON 的畫面
這裡可以再對照一次 Day 9:
我們在 Python 寫的是 False,回傳出來變成 false,
一樣是被轉成 JSON 了,只是這次是 Flask-RESTX 幫我們處理的。
流程:
GET Request 到 /tasks
↓
Flask-RESTX 找到 /tasks 對應的 Resource
↓
因為是 GET Request
↓
執行 get()
↓
回傳資料
↓
Response
到這裡,我們已經使用 Flask-RESTX 建立出第一個簡單的 API。
不過 Flask-RESTX 還有一個很方便的功能,就是可以幫我們建立 Swagger API 文件。
下一篇就來看看 Swagger 是什麼,以及怎麼透過 Swagger 查看和測試我們的 API。