Flask_restful 之 自定义错误信息

Flask_restful 之 自定义错误信息

@(Python学习-随手记)[Flask_restful, 帮助]html

  • 注意:
    • 不管是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错误
    在这里插入图片描述python

  • 若是这样的错误信息和状态码并非咱们想要的,或者并非很友好,怎么解决,这时须要自定义错误信息web

自定义错误信息(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子类异常,若是不修改错误信息则返回以下:
    在这里插入图片描述json

  • 源代码:BadRequest(HTTPException)flask

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-restfulapi