Try   HackMD

Flask實作_WEB API_02_續談WEB API

tags: python flask api

Flask實作_WEB API_01_初探WEB API裡面已經初步瞭解要利用flask來建置一個api service有多麼簡單,但作法上好像不是那麼科學,要寫一堆的@app.route,然後在view function判斷是GET還是POST,這樣下去整個程式碼會一堆@app.route,有點雜亂,應該有什麼比較直觀的作法才對。

當然使用extension是一個辦法(如Flask-RESTful),不過在使用之前我們還是自己先瞭解一下如何單純的利用flask所提供的工具來完成。

說明

在flask內除了利用@app.route的方法來建置路由之外,還可以利用類別來建置,這部份可以從官方文件看到更詳細的資料,其中Method Based Dispatching就是我們預計採用的方式。

For RESTful APIs it’s especially helpful to execute a different function for each HTTP method

官方說明也清楚指出,這對RESTful API是非常有幫助的。

總之,這就是我們預計採用的方式,就動手吧。

實作

一樣的利用Flask實作_WEB API_01_初探WEB API所新增的專案以及python文件。

首先,清空pyAPI.py,然後重新寫入程式碼:

from flask import Flask, jsonify from flask.views import MethodView app = Flask(__name__) class API_Test(MethodView): def get(self): return jsonify(message='I am GET') def post(self): return jsonify(message='I am POST') def delete(self): return jsonify(message='I am DELETE') app.add_url_rule('/test_api/', view_func=API_Test.as_view('test_api')) if __name__ == '__main__': app.run(debug=True)

第2行:這就是採用Method Based Dispatching需要用到的類別
第7行:繼承MethodView,依不同的http method設置相對應的class method
第18行:利用app.add_url_rule註冊路由並定義相對應的view function

接著執行專案,然後你可以試著用python的套件requests測試api是否正常,這並不是標準套件,所以如果沒有的話就需要安裝:

pip install requests

然後就試著呼叫get:

api_get = requests.get(url='http://127.0.0.1:5000/test_api/')

回傳的是Response的物件

type(api_get) <class 'requests.models.Response'>

我們可以從這個物件取得我們想要的很多資訊:

api_get.json()
{'message': 'I am GET'}
api_post = requests.post(url='http://127.0.0.1:5000/test_api/')
api_post.json()
{'message': 'I am POST'}
api_delete = requests.delete(url='http://127.0.0.1:5000/test_api/')
api_delete.json()
{'message': 'I am DELETE'}

結論

相同的事情如果用@app.route的方式作,可能會像下面這樣:

@app.route('test_api2', methods=['GET'])
def test_api2_get():
    pass

@app.route('test_api2', methods=['POST'])
def test_api2_post():
    pass

相較之下,直接使用建置類別的方式似乎除了比較好維護之外也比較直觀。不管如何,我們已經知道怎麼樣利用flask來建置一個api service,但,好像少了什麼,似乎應該要有身份的驗證才對,這讓人傷腦筋,下一次再來煩惱。