API(Application programing interface)在現在的網路世界中是相當範用的,
每天我們只要連上網路都少不了API的影子,
而且在近幾年RESTful API ,Nodejs 與NoSQL的出現,
統一了從後端倒前端的資料格式,
不但可以解決大部分的資料格式轉換問題,
也使的程式的可閱讀性大為提昇。
而設計RESTful server 的時候有幾個必須要注意的地方:
Flask 的 API作法有幾種呢?
先從最簡單的Function view來說起,
from flask import Flaskapp = Flask(__name__)
@app.route('/')def index():
return "Hello, World!"
if __name__ == '__main__':
app.run(debug=True)
這個的優點就是初期架構很快,
可以很快的寫出一個小型的API提供 client 或是 server 呼叫,
每一個Function 也可以對應多個method(get, post, update, put, delete.....),
在Function中利用request.method判斷對應的method來進行相對應的程式,
缺點自然顯而易見,
成長後的可閱讀性不高,
而且針對API的 行為 grouping 也沒有作到,
後期的維護成本會隨著變肥大而成正比的越加困難,
若你的API定義成為微小的並且沒有成長性的話可以使用這個方式來實作並無不可。
第二種方式就是Flask 的 class view
from flask import Blueprint
from flask.views import MethodView
users = Blueprint('users', __name__, template_folder='templates')
class UserView(MethodView):
def get(self):
pass
def post(self):
pass
def update(self):
pass
def delete(self):
pass
users.add_url_rule('/', view_func=UserView.as_view('user'))
結構大致上如上例
可以針對某一個行為作grouping的動作,
依照method 對User 進行CRUD,
優點除了後期維護以及可閱讀性之外,
攥寫難度也並沒有提高太多,
第三種方式則是Flask-restful,
而Flask 也有針對restful推出相對應的 lib
Flask-restful Sample 如下:
#-*- coding:utf-8 -*-
from flask import Flask, request, jsonify, abort
from flask.ext.restful import Api, Resource, reqparse
app = Flask(__name__)
api = Api(app)
class TaskListAPI(Resource):
def __init__(self):
self.reqparse = reqparse.RequestParser()
self.reqparse.add_argument('title', type=str, required = True, help = u'No task title provided', location = 'json')
self.reqparse.add_argument('description', type=str, default='', location='json')
super(TaskListAPI, self).__init__()
def post(self):
task = request.get_json(force=True)
#檢查request 的 args
args = self.reqparse.parse_args()
if len(task) == 0:
abort(404)
if task is not request.json:
abort(400)
return { 'task': task }, 202
api.add_resource(TaskListAPI, '/tasklist/', endpoint = 'tasklist')
app.run(debug=True)
除了提供對應的method之外,
還可以在__init__中利用reqparse檢查request的 json 格式是否正確,
不但減少在method 中的檢查與回饋,
在規劃上更貼近於API概念與邏輯,