2018年2月3日 星期六

[Flask]FlaskAPI撰寫方法與Decorator檢查參數

Flask是個簡易的WebAPI撰寫框架, 短時間內即可實現網路服務, 這裡使用Flask做個範例, 並且搭配Python Decorator檢查Request參數, 最後用Json回傳結果


FlaskAPI寫法簡單, 但寫法卻不只一種, 這裡舉我最常使用的方式當成例子, 搭配Python Decorator做參數檢查, 最後用Json回傳結果

#!flask/bin/python
# -*- coding: utf-8 -*-

import pandas as pd
import json
from datetime import datetime,timedelta
from flask import Flask, jsonify
from flask.views import MethodView
from FlaskApi_CheckAttribute import *
from Utility_JsonConverter import JsonConverter

app = Flask(__name__)

class GetEmployeeIdView(MethodView): 
     
    @requires_json_check_param #Decorator
    def post(self):
        """
        Json
        { 
            "EmployeeId":"12345678",
        }
        """       
        
        emp_id = request.json['EmployeeId'] #接值

        try:
            api_start = datetime.now()
                    
            #回傳Json
            return jsonify(code=StateCode.Success,
                           message="success",
                           api_start=api_start,
                           emp_id=emp_id)
     
        except Exception as e:
                               
            return jsonify(code=StateCode.Unexpected,
                           message='exception : ' + str(e)), 999

if __name__ == "__main__":  
    
    # 建立 View
    app.add_url_rule('/api/getEmployeeId', view_func=GetEmployeeIdView.as_view('GetEmployeeIdView'))  
    # 啓動
    app.run(port=5001, host='000.000.000.000', debug=True, use_reloader=False, threaded=True)

當Function有設定Decorator時, 會先進入Decorator進行規則判斷,這裏就是使用此原理,先對request參數進行檢查, 接下來就是建立Decorator, 當缺少EmployeeId這個參數就會引發例外, 程式中可會設定例外訊息

# encoding=UTF-8
#!flask/bin/python

import sys

from functools import wraps
from werkzeug.exceptions import Unauthorized, UnsupportedMediaType, BadRequest
from itsdangerous import BadSignature
from flask import abort
import numbers
import collections

# from . import app

from flask import g, request

def requires_json_check_param(f):
    @wraps(f)
    def decorated(*args, **kwargs):
        jsonError = "缺少參數 : "

        if not 'EmployeeId' in request.json: raise BadRequest(jsonError + "EmployeeId")   
       
        return f(*args, **kwargs)
        
    return decorated

沒有留言:

張貼留言