从POST方法重定向后Flask错误

时间:2016-04-24 12:48:22

标签: ajax redirect flask

我正在使用Flask和Javascript的组合。用户从网页输入后,我将JSON对象发送回Flask服务器。即:

var xhr = new XMLHttpRequest();
xhr.open('POST', '/completed/');
xhr.setRequestHeader('Content-Type', 'application/json');
var stringifiedObject = dataResultToJSON(data);
xhr.send(stringifiedObject);

然后在Flask:

@main_view.route('/completed/', methods=['POST'])
def completed():
    if (request.headers['Content-Type'].startswith('application/json')):
        #do stuff here
        return redirect(url_for("main_view.home"))

@main_view.route('/')
def home():
    logger.debug(">>home")
    return render_template('home.html')

当烧瓶重定向到' home'在Ajax POST之后,我得到以下控制台输出:

DEBUG:myapp:>>home
INFO:werkzeug:127.0.0.1 - - [24/Apr/2016 20:13:15] "GET / HTTP/1.1" 200 -
INFO:werkzeug:127.0.0.1 - - [24/Apr/2016 20:13:15] "GET /%3C!DOCTYPE%20html%3E%3C!-- (... entire web page html)

奇怪的是上面的第二个INFO声明 - 当我从其他任何地方重定向到家时,我不会打印这一行 - 只有当我从完成的'重定向时才会出现。 POST方法。 Werkzeug记录整个home.html网页html,我在Web客户端收到错误:

NetworkError: 404 NOT FOUND - http://127.0.0.1:5000/%3C!DOCTYPE%20html%3E%3C!-- (... entire web page html)

我还在此处向重定向添加了代码= 307:Make a POST request while redirecting in flask但仍然遇到了相同的404错误。

我很困惑如何解决这个问题。

2 个答案:

答案 0 :(得分:1)

我认为您的问题是您将数据作为AJAX请求发布(即不是浏览器导航,而是以编程方式从您的客户端发布)。在POST完成后告诉您的AJAX客户端重定向没有多大意义。

然后您尝试告诉客户端重定向...但重定向请求将返回到XMLHttpRequest。

我并不是100%确定你想要发生什么,但是如果你希望客户端在发布数据后重定向,你可能最好使用常规表单帖子。

我相信这个问题的答案可以更好地说明你想要做的事情:

How to manage a redirect request after a jQuery Ajax call

答案 1 :(得分:1)

我按照上面的评论和回答完成了这项工作。具体来说,我做了:

def completed():
    #other code here
    return url_for("main_view.home")

和JS:

xhr.onreadystatechange = function() {
    if (xhr.readyState == XMLHttpRequest.DONE) {
        var OK = 200;
        if (xhr.status === OK) {
            window.location.href = xhr.responseText;
        }
        else {
            console.log ('Error: ' + xhr.status); 
        }
    }
};