1. 程式人生 > >Flask中實現統一異常處理

Flask中實現統一異常處理

開發十年,就只剩下這套架構體系了! >>>   

寫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!'