我有一个瓶子服务器,它返回HTTPErrors:
return HTTPError(400, "Object already exists with that name")
当我在浏览器中收到此回复时,我希望能够找出给出的错误消息。就像现在一样,我可以在响应的responseText
字段中看到错误消息,但是它隐藏在一个HTML字符串中,如果我不需要,我宁愿不解析。
有什么办法可以在Bottle中专门设置错误信息,这样我就可以在浏览器的JSON中选择它了吗?
答案 0 :(得分:7)
HTTPError
使用预定义的HTML模板构建响应主体。您可以将HTTPError
与适当的状态代码和正文一起使用,而不是使用response
。
import json
from bottle import run, route, response
@route('/text')
def get_text():
response.status = 400
return 'Object already exists with that name'
@route('/json')
def get_json():
response.status = 400
response.content_type = 'application/json'
return json.dumps({'error': 'Object already exists with that name'})
# Start bottle server.
run(host='0.0.0.0', port=8070, debug=True)
答案 1 :(得分:5)
我正在寻找类似的方法,将所有错误消息作为JSON响应处理。上述解决方案的问题在于,他们不会以一种漂亮而通用的方式执行此操作,即处理任何可能的弹出错误,而不仅仅是已定义的400等.Imho最干净的解决方案是,覆盖默认错误,以及然后使用自定义瓶子对象:
class JSONErrorBottle(bottle.Bottle):
def default_error_handler(self, res):
bottle.response.content_type = 'application/json'
return json.dumps(dict(error=res.body, status_code=res.status_code))
传递的res
参数有更多关于抛出错误的属性,可能会返回,请参阅默认模板的代码。特别是.status
,.exception
和.traceback
似乎相关。
答案 2 :(得分:3)
只是刚开始使用瓶子,但会推荐更多的内容:
import json
from bottle import route, response, error
@route('/text')
def get_text():
abort(400, 'object already exists with that name')
# note you can add in whatever other error numbers
# you want, haven't found a catch-all yet
# may also be @application.error(400)
@error(400) #might be @application.error in some usages i think.
def json_error(error):
"""for some reason bottle don't deal with
dicts returned the same way it does in view methods.
"""
error_data = {
'error_message': error.body
}
response.content_type = 'application/json'
return json.dumps(error_data)
没有运行上述内容所以期待错误,但你得到了要点。