Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 烧瓶中的自定义自动重定向_Python_Rest_Redirect_Flask - Fatal编程技术网

Python 烧瓶中的自定义自动重定向

Python 烧瓶中的自定义自动重定向,python,rest,redirect,flask,Python,Rest,Redirect,Flask,我正在使用Flask构建一个ReST/JSON API。我希望我的所有响应都是JSON,即使它们是错误响应 对于成功的操作和大多数错误,我已经让我的应用程序返回统一的JSON响应。以下是我代码的相关部分: from flask import Flask, jsonify from werkzeug import exceptions app = Flask(__name__) def make_json_response(status, message, content): """F

我正在使用Flask构建一个ReST/JSON API。我希望我的所有响应都是JSON,即使它们是错误响应

对于成功的操作和大多数错误,我已经让我的应用程序返回统一的JSON响应。以下是我代码的相关部分:

from flask import Flask, jsonify
from werkzeug import exceptions

app = Flask(__name__)

def make_json_response(status, message, content):
    """Function to generate uniform JSON responses across the API"""
    response = {
        "api_version": __version__,
        "content": content,  # The data the API is supposed to return
        "message": message,  # Content description, error message, etc.
        "request_id": g.get("request_id", None),
        "status": status,  # HTTP Status
    }
    return jsonify(response), status


def json_error_handler(error=exceptions.InternalServerError, message=None):
    """Makes JSON error messages. By default, Flask will return HTML error 
    messages, but we want this API to return valid JSON even on errors."""
    return make_json_response(
        status=error.code, message=message or error.description, content=None)


# Registering JSON error handlers for each HTTP error that we might reasonably throw.
# Covers 400, 401, 403, 404, 405, 406, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 422, 428, 429, 431, 500, 501, 502, 503, 504, 505
for error_class in exceptions.default_exceptions.values():
    app.register_error_handler(error_class, json_error_handler)
所以这些都起作用了。但是,300-3XX响应未得到解决。据我所知,重定向错误与其他错误的方式不同,它们不是
raise
d。例如,当我的代码中有错误时,500可能会在任何时候攻击,但300是一个路由决定,并且在到达我的代码之前发生

Flask非常有帮助地生成自动重定向响应。例如,如果用户试图获取
/jobs
,但实际路径是
/jobs/
,Flask将以重定向进行回复,而我这一方没有额外的工作:

$ curl -i https://api.example.com/jobs
HTTP/1.1 301 MOVED PERMANENTLY
Server: gunicorn/19.6.0
Date: Thu, 01 Jun 2017 14:40:18 GMT
X-Cnection: close
Content-Type: text/html; charset=utf-8
Location: http://api.example.com/jobs/
Content-Length: 295

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>Redirecting...</title>
<h1>Redirecting...</h1>
<p>You should be redirected automatically to target URL: <a href="http://api.example.com/jobs/">http://api.example.com/jobs/</a>.  If not click the link.
$curl-ihttps://api.example.com/jobs
HTTP/1.1 301永久移动
服务器:gunicorn/19.6.0
日期:2017年6月1日星期四14:40:18 GMT
X-C检查:关闭
内容类型:text/html;字符集=utf-8
地点:http://api.example.com/jobs/
内容长度:295
重定向。。。
重定向。。。
您应该自动重定向到目标URL:。如果没有,请单击链接。
这是可取的行为。唯一的问题是生成的响应不符合API其余响应使用的JSON响应模式。这可能会导致期望JSON响应的客户端爆炸。(现在,任何脆弱到足以产生该问题的客户端都应该真正了解正确的URI,但我仍然希望API响应是统一的,并且是有帮助的。)

据我所知,在幕后,Flask使用生成重定向,但我看不到一种明显的方法可以将我自己的重定向功能修补到我的Flask应用程序中


是否有办法更改自动生成的烧瓶重定向响应

您是否尝试过在什么上下文中使用
response.mimetype='application/json'
?@Nurzhan?我没有在代码中的任何地方生成301响应,Flask会自动为我生成。您是否尝试在什么上下文中使用
response.mimetype='application/json'
?@Nurzhan?我不会在代码中的任何地方生成301响应,Flask会自动为我生成301响应。