无法从Flask-Restful应用中以JSON而不是html的形式返回404错误

时间:2019-03-09 20:10:52

标签: flask flask-restful

我正在进行一个简单的Flask REST API测试,例如,当我调用{{url}} / items时,我得到了项目列表。但是,如果将呼叫传递到不存在的端点(例如{{url}} / itemsss),则会在html中收到错误404。

对于某些错误,例如400、404,405 ...,我想使错误处理更加友好,并返回json而不是html ...

例如,对于404,我尝试了以下方法:

@app.errorhandler(404)
def not_found(e):
    response = jsonify({'status': 404,'error': 'not found',
                        'message': 'invalid resource URI'})
    response.status_code = 404
    return response

但是它不起作用。

我的问题与此类似:Python Flask - Both json and html 404 error

我想知道,使用蓝图是否是实现这一目标的唯一方法?

是否有更简单的方法将404错误输出为json?

例如,代替此:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">

<title>404 Not Found</title>

<h1>Not Found</h1>

<p>The requested URL was not found on the server.  If you entered the URL manually please check your spelling and try again.</p>

类似这样的东西:

{

error: true,

status: 404,

code: "error.notFound",

message: "API endpoint not found",

data: { }

}

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

我想我在 official documentation 中找到了解决方案:

from flask import json
from werkzeug.exceptions import HTTPException

@app.errorhandler(HTTPException)
def handle_exception(e):
    """Return JSON instead of HTML for HTTP errors."""
    # start with the correct headers and status code from the error
    response = e.get_response()
    # replace the body with JSON
    response.data = json.dumps({
        "code": e.code,
        "name": e.name,
        "description": e.description,
    })
    response.content_type = "application/json"
    return response

答案 1 :(得分:1)

通常,当我需要使用Flask-RESTful返回自定义错误消息时,我会执行以下操作:

from flask import make_response, jsonify

def custom_error(message, status_code): 
    return make_response(jsonify(message), status_code)