2016-04-24 65 views
1

我正在使用烧瓶和Javascript的组合。在用户从网页输入后,我发送一个JSON对象回到Flask服务器。即:POST方法重定向后出现烧瓶错误

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

然后在瓶:

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

当烧瓶重定向到asfter阿贾克斯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错误。

我被困在如何解决这个问题。

+1

我的信念是,你正在使用JavaScript重定向到POST的结果。这将是'home'呈现的HTML。您可能只想'完成'来'返回url_for('main_view.home')'而不是返回重定向。 – dirn

回答

1

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

然后,您试图告诉客户端重定向...但重定向请求正在返回到XMLHttpRequest。

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

我相信你正在试图做的答案是更好地说明这个问题是什么:

How to manage a redirect request after a jQuery Ajax call

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); 
     } 
    } 
};