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,但,好像少了什麼,似乎應該要有身份的驗證才對,這讓人傷腦筋,下一次再來煩惱。