Flask_restful 之 自定义错误信息
@(Python学习-随手记)[Flask_restful, 帮助]
- 注意:
- 无论是
Exception
异常、HTTPException
异常、还是及其子类异常都可以实现自定义错误信息 - 如果是
Exception
异常,则会在控制台打印Traceback信息
,而HTTPException
异常则不会。所以如果是与HTTP 请求相关的自定义异常,继承自HTTPException
较为合适 - 需要将
debug
设置为false
:app.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
,status
,extra
信息 - 初始化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