在我們編寫Restful Api的時(shí)候,非常常見的是flask內(nèi)建的exception不夠用佳鳖,所以我們需要擴(kuò)展flask中的exception,從而滿足我們的定制化需求。
下面的代碼是一個(gè)簡單的定制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這個(gè)function恋昼,因?yàn)樵诜祷氐捻撁嬷行枰裡rror message以json的格式展示出來。之后我們需要構(gòu)建我們exception class赶促,InvalidUsage這個(gè)class繼承自Exception class液肌,在constructor中做一些error checking和參數(shù)的初始化。之后只有一個(gè)方法叫做to_dict()需要我們把message和payload轉(zhuǎn)換成dict的格式鸥滨,從而方便把它格式成json嗦哆。
在我們完成InvalidUsage class之后,理論上我們已經(jīng)用raise InvalidUsage了爵赵,但是我們還沒有在flask中注冊(cè)它吝秕,所以還需要注冊(cè)這個(gè)error handler。在flask中還是通過decorator來實(shí)現(xiàn)的空幻,用@app.errorhandler(InvalidUsage)注冊(cè)InvalidUsage烁峭,之后把json化的值賦和status_code賦值給response,然后我們就可以非常方便的使用InvalidUsage了秕铛。