iT邦幫忙

DAY 2
0

Play with Flask And MongoDB系列 第 2

Day2 - Flask API

  • 分享至 

  • xImage
  •  

API(Application programing interface)在現在的網路世界中是相當範用的,

每天我們只要連上網路都少不了API的影子,

而且在近幾年RESTful API ,Nodejs 與NoSQL的出現,

統一了從後端倒前端的資料格式,

不但可以解決大部分的資料格式轉換問題,

也使的程式的可閱讀性大為提昇。

而設計RESTful server 的時候有幾個必須要注意的地方:

  1. 一個request 代表一個動作,也必須包含此動作所有的資料
  2. 在client 和 server 端中制定標準,結束後不論客端是否需要都需要回傳值
  3. client 和 server 彼此溝通的方式與資料格式必須是統一的
  4. Server 視Client 需求提供script 或 lib 使用(這就看需求了,可有可無)

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概念與邏輯,

參考資料:

Miguel Grinberg's Blog


上一篇
Day 1 - 目標與Flask-WTF淺談
下一篇
Day 3 - Mongoengine
系列文
Play with Flask And MongoDB11
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言