Flask_restful 之 自定義錯誤資訊

小小程式設計師愛滑雪滑雪發表於2020-11-18

Flask_restful 之 自定義錯誤資訊

@(Python學習-隨手記)[Flask_restful, 幫助]

  • 注意:
    • 無論是Exception異常、HTTPException異常、還是及其子類異常都可以實現自定義錯誤資訊
    • 如果是Exception異常,則會在控制檯列印Traceback資訊,而HTTPException異常則不會。所以如果是與HTTP 請求相關的自定義異常,繼承自HTTPException較為合適
    • 需要將debug設定為falseapp.run(debug=False),否則就會進入debug模式並顯示http stacktrace錯誤。
  • 使用postman模擬瀏覽器請求

起源:產生問題

from flask import Flask
from flask_restful import Resource, Api, abort,HTTPException
from werkzeug.exceptions import BadRequest

app = Flask(__name__)
# api = Api(app,errors=errors)
api = Api(app)

class DemoTest(Resource):
    # 定義類繼承Resouce
    def get(self):
        raise TypeError(u"錯了吧")

# 將資源類掛載在'/'路由下
api.add_resource(DemoTest,'/')

if __name__ == '__main__':
    app.run(debug=False)
  • 當使用postman請求127.0.0.1:5000時,出現500錯誤
    在這裡插入圖片描述

  • 如果這樣的錯誤資訊和狀態碼並不是我們想要的,或者並不是很友好,怎麼解決,這時需要自定義錯誤資訊

自定義錯誤資訊(Exception)

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

from flask import Flask
from flask_restful import Resource, Api, abort,HTTPException
from werkzeug.exceptions import BadRequest

errors = {
    # StandardError(Exception)的子類
    "TypeError":{
        'message': "TypeError 錯誤資訊已被修改",
        'status': 200,
        'extra': "TypeError 被修改了,你看吧",
    }
}

app = Flask(__name__)
api = Api(app,errors=errors)


class DemoTest(Resource):
    # 定義類繼承Resouce
    def get(self):
        raise TypeError(u"錯了吧")

# 將資源類掛載在'/'路由下
api.add_resource(DemoTest,'/')

if __name__ == '__main__':
    app.run(debug=False)
  • 定義字典errors,key表示異常類名,value表示自定義的錯誤資訊,包括message,statusextra資訊
  • 初始化Api:api = Api(app,errors=errors)
  • postman請求127.0.0.1:5000時,即使人為的丟擲TypeError異常,但我們修改了錯誤資訊,導致請求依然會成功
    在這裡插入圖片描述

自定義錯誤資訊(HTTPException)

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

from flask import Flask
from flask_restful import Resource, Api, abort,HTTPException
from werkzeug.exceptions import BadRequest

errors = {
    # StandardError(Exception)的子類
    "TypeError":{
        'message': "TypeError 錯誤資訊已被修改",
        'status': 200,
        'extra': "TypeError 被修改了,你看吧",
    },
    # HTTPException的子類
    # "BadRequest":{
    #     'message': "BadRequest 錯誤資訊已被修改",
    #     'status': 200,
    #     'extra': "BadRequest 被修改了,你看吧",
    # }
}

app = Flask(__name__)
api = Api(app,errors=errors)

class DemoTest(Resource):
    # 定義類繼承Resouce
    def get(self):
        # 丟擲 HTTPException 異常
        raise BadRequest()

# 將資源類掛載在'/'路由下
api.add_resource(DemoTest,'/')

if __name__ == '__main__':
    app.run(debug=False)
  • 這次我們人為丟擲HTTPException子類異常,如果不修改錯誤資訊則返回如下:
    在這裡插入圖片描述

  • 原始碼:BadRequest(HTTPException)

class BadRequest(HTTPException):

    """*400* `Bad Request`

    Raise if the browser sends something to the application the application
    or server cannot handle.
    """
    code = 400
    description = (
        'The browser (or proxy) sent a request that this server could '
        'not understand.'
    )
  • 如果自定義錯誤資訊後,postman請求返回200狀態碼
#!/use/bin/python
# --*-- coding: utf-8 -*-

from flask import Flask
from flask_restful import Resource, Api, abort,HTTPException
from werkzeug.exceptions import BadRequest

errors = {
    # StandardError(Exception)的子類
    "TypeError":{
        'message': "TypeError 錯誤資訊已被修改",
        'status': 200,
        'extra': "TypeError 被修改了,你看吧",
    },
    # HTTPException的子類
    "BadRequest":{
        'message': "BadRequest 錯誤資訊已被修改",
        'status': 200,
        'extra': "BadRequest 被修改了,你看吧",
    }
}

app = Flask(__name__)
api = Api(app,errors=errors)

class DemoTest(Resource):
    # 定義類繼承Resouce
    def get(self):
        # 丟擲 HTTPException 異常
        raise BadRequest()
        # 丟擲Exception 異常
        # raise TypeError(u"錯了吧")

# 將資源類掛載在'/'路由下
api.add_resource(DemoTest,'/')

if __name__ == '__main__':
    app.run(debug=False)

在這裡插入圖片描述

原始碼

class flask.ext.restful.Api(app=None, prefix='', default_mediatype='application/json', decorators=None, catch_all_404s=False, url_part_order='bae', errors=None)

其中:
errors () – A dictionary to define a custom response for each exception or error raised during a request
  • 譯為:一個字典,用於為請求過程中出現的錯誤或者異常自定義響應資訊

官方文件

define-custom-error-messages
custom-error-message-json-object-with-flask-restful

相關文章