关于javascript:Flask redirect(urlfor()) 不会重新加载页面

Flask redirect(urlfor()) doesn't reload the page

本问题已经有最佳答案,请猛点这里访问。

我有一个页面,上面有一个按钮,可以让ajaxpostflask路由。我希望路由计算一条消息(例如,通过硬编码简化),并将其传回另一个路由,然后重新加载用户所在的页面。redirect(urlfor())确实调用了另一个路由,但是render_template似乎没有被调用,因为页面没有重新加载。

英利

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from flask import Flask, render_template, request, redirect, url_for

app = Flask(__name__)


@app.route('/second_route', methods=['POST'])
def second_route():
    print request.json
    return redirect(url_for('hello_world', message='test'))


@app.route('/')
def hello_world(message=None):
    return render_template('index.html', message=message)


app.run()

索引文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<html>
<head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js">


   
        $(document).ready(function () {
            $('#mybutton').click(function () {
                $.ajax({
                    type:"POST",
                    contentType:"application/json; charset=utf-8",
                    url:"/second_route",
                    data: JSON.stringify({}),
                    success: [],
                    dataType:"json"
                });

            });
        });


   
</head>
<body>
{{ message }}
<button id="mybutton" name="mybutton" type="button">Click Me!</button>
</body>
</html>


这就是我为阅读问题的人解决问题的方式。

将我的发布请求更改为发布到相同的路由。使用此调用加载页面:

1
2
3
4
 var posting = $.post(window.location.href, {'some key': 'some value'});
                posting.done(function( ) {
                    window.location.replace(window.location.href);
                });


Ajax无法处理重定向响应afaik。不过,您可以将{{message}}封装在中,标识元素,并执行jquery .html()在Ajax完成成功后插入自定义文本。

1
2
3
4
5
6
7
8
9
10
11
12
13
$.ajax({
   type:"POST",
   contentType:"application/json; charset=utf-8",
   url:"/second_route",
   data: JSON.stringify({}),
   success: [],
   dataType:"json"
}).done(function(){
   $('#message').html('test');
   window.location.href = '/';
}).fail(function(response){
   $('#message').html(response['responseText']);
});

为了重定向,您可以将done子句中的代码替换为window.location.href="/someURL",但由于端点是相同的,所以不需要这样做。这样,使用message变量根本就不是必要的。