在我們編寫Restful Api的時候,非常常見的是flask內建的exception不夠用,所以我們需要擴展flask中的exception,從而滿足我們的定制化需求。
下面的代碼是一個簡單的定制exception的例子:
from flask import Flask
from flask import jsonify
app = Flask(__name__)
class InvalidUsage(Exception):
status_code = 400
def __init__(self, message, status_code = None, payload = None):
Exception.__init__(self)
self.message = message
if status_code is not None:
self.status_code = status_code
self.payload = payload
def to_dict(self):
rv = dict(self.payload or ())
rv['message'] = self.message
return rv
@app.errorhandler(InvalidUsage)
def handle_invalid_useage(error):
response = jsonify(error.to_dict())
response.status_code = error.status_code
return response
@app.route('/')
def hello_world():
return 'Hello, World!'
@app.route('/errorpage')
def error_test():
raise InvalidUsage('Error in this page', status_code = 401)
首先我們要import jsonify這個function,因為在返回的頁面中需要把error message以json的格式展示出來。之后我們需要構建我們exception class,InvalidUsage這個class繼承自Exception class,在constructor中做一些error checking和參數的初始化。之后只有一個方法叫做to_dict()需要我們把message和payload轉換成dict的格式,從而方便把它格式成json。
在我們完成InvalidUsage class之后,理論上我們已經用raise InvalidUsage了,但是我們還沒有在flask中注冊它,所以還需要注冊這個error handler。在flask中還是通過decorator來實現的,用@app.errorhandler(InvalidUsage)注冊InvalidUsage,之后把json化的值賦和status_code賦值給response,然后我們就可以非常方便的使用InvalidUsage了。