【问题标题】:Flask error after redirect from POST method从 POST 方法重定向后的烧瓶错误
【发布时间】:2016-08-17 19:48:04
【问题描述】:

我正在使用 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')

当烧瓶在 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,我在网络客户端中收到错误:

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

我还按照此处将 code=307 添加到重定向中:Make a POST request while redirecting in flask 但仍然出现相同的 404 错误。

我不知道如何解决这个问题。

【问题讨论】:

  • 我认为您正在使用 JavaScript 重定向到 POST 的结果。这将是home 呈现的 HTML。您可能只希望 completedreturn url_for('main_view.home') 而不是返回重定向。

标签: ajax redirect flask


【解决方案1】:

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

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

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

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

How to manage a redirect request after a jQuery Ajax call

【讨论】:

    【解决方案2】:

    我在上面的评论和回答之后得到了这个工作。具体来说,我做了:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-13
      • 2017-05-11
      • 2014-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-15
      相关资源
      最近更新 更多