如何使用Bottle HTTPError返回JSON格式的错误信息?

7

我有一个服务器,返回的HTTPErrors如下:

return HTTPError(400, "Object already exists with that name")

当我在浏览器中收到这个响应时,我想要找出给出的错误消息。目前我可以在响应的responseText字段中看到错误消息,但它被深埋在一个HTML字符串中,如果不必要,我宁愿不解析它。

有没有办法在Bottle中专门设置错误消息,以便我可以在浏览器中以JSON形式找出它?


1
不相关,但是...那是一个实际的错误吗?如果是,它不应该是400状态码。在我看来,应该返回409冲突 - That1Guy
3个回答

10

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)

5

我正在寻找一种类似的方法,以将所有错误消息处理为JSON响应。以上解决方案的问题在于它们没有以一种好的和通用的方式来处理任何可能出现的错误,而不仅仅是定义的400等。在我看来,最清晰的解决方案是覆盖默认错误,然后使用自定义的Bottle对象进行操作:

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似乎很重要。

1
描述如何使用这样的类会很有用。仅仅声明这个类似乎没有任何作用 - 你如何告诉Bottle将其用作默认错误处理程序? - codebox

4

我刚开始使用bottle,但我建议使用更类似于以下内容的东西:

import json
from bottle import route, response, error, abort

@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)

我没有运行上面的代码,所以可能会有错误,但你可以理解其中的意思。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接