Flask中實現統一異常處理
阿新 • • 發佈:2019-03-26
寫JavaEE專案多了,形成了一定的流程樣式,異常處理也是很重要的環節。
現在開始寫python,相信肯定有一樣的實現。沒錯,flask有這樣的功能。
建立一個Flask專案後,預設的情況下,可以在app上註冊errorhandler錯誤處理器,如:
@app.errorhandler(InvalidUsage) def handle_invalid_usage(error): response = jsonify(error.to_dict()) response.status_code = error.status_code return response
可以看出,這個errorhandler處理器註冊在app上,只能對app使用。
那麼,問題來了,在一個專案中,單一的app侷限性太強了,肯定要分各種模組藍本,那麼,每個模組藍本該怎麼使用統一的errorhandler呢?
首先,可以先開發一個公共模組藍本,例如common
from flask import Blueprint, jsonify
cbp = Blueprint('common', __name__)
然後,在common模組藍本中新增自定義異常處理類:
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
接下來就是重點了,要把整個專案中所有web的異常統一處理了。
@cbp.app_errorhandler(InvalidUsage)
def handle_invalid_usage(error):
response = jsonify(error.to_dict())
response.status_code = error.status_code
return response
看出與前面的那個errorhandler有什麼不同了嗎?主要是註解那裡,使用了cbp的藍本,註冊到全域性的errorhandler方式是app_errorhandler。
至此,全域性的就可以這麼實現了。
如何使用呢?
首先,要在使用的地方引入異常類
from common import InvalidUsage
然後在程式碼中丟擲這個異常:
@app.route('/')
def hello_world():
if True:
raise InvalidUsage('This view is gone', status_code=410)
return 'Hello World!'