2016-04-24 76 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); 
     } 
    } 
};