每 5 秒收到一个 POST 请求后,将变量值传递给模板

pass variable value to template after receiving a POST request every 5 sec

问题是在我收到请求并将值赋给变量 msg 之后,我的模板 login.html 仍然是空的,我想查看消息 = 'got it'.

app.py

from flask import Flask, render_template, redirect, url_for, request

app = Flask(__name__)

@app.route('/req', methods=['GET', 'POST'])
def req():
    msg = None
    if request.method == 'POST':
        if request.values.get('name', None) == 'asdf':
            msg = 'got it'
    #print msg - variable msg = 'got it'
    return render_template('login.html', msg=msg)

if __name__ == '__main__':
    app.run(debug=True)

login.html

<html>
  <head>
    <title></title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="static/bootstrap.min.css" rel="stylesheet" media="screen">
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>

    <script type="text/javascript">
    var test = function() {
        $(function() {
             $.ajax({
                type: "POST",
                url: "/req",
                data: {'name': 'asdf'},
            });    
        });
    }
    window.setInterval(function() {
      test()
    }, 5000);
    </script>

  </head>
  <body>
  {% if msg %}
    {{ msg }} #empty page
  {% endif %}
    </div>
  </body>
</html>

您似乎混淆了模板渲染和 Ajax。

您的 JavaScript test 函数 在后端调用您的 req 视图方法, 呈现一个模板,但您没有对该模板执行任何操作。

您尝试在包含 # empty page 注释的模板中打印的 msg 变量将永远不会呈现,因为没有 msg 变量不是None 在呈现基本模板时。 msg 由 POSTing 通过 Ajax 设置,但永远不会显示呈现的模板。

如果您的目标只是在页面上看到 msg 输出,那么您的 req 方法只是 return POST:

@app.route('/req', methods=['GET', 'POST'])
def req():
    msg = None
    if request.method == 'POST':
        if request.values.get('name', None) == 'asdf':
            return 'got it'
    return render_template('login.html', msg=msg)

并且在您的 Ajax 通话中,

var test = function() {
    $(function() {
        $.ajax({
            type: "POST",
            url: "/req",
            data: {'name': 'asdf'},
            success: function(data) {
                // do something with your 'got it' string
            }
        });    
    });
}

如果您真的想要 return 您在问题中所写的模板,最好提交一个表单而不是 Ajax,这样您就可以浏览到新页面:

@app.route('/req', methods=['GET', 'POST'])
def req():
    msg = None
    if request.method == 'POST':
        if request.values.get('name', None) == 'asdf':
            render_template('login.html', msg=msg)
    return render_template('login.html', msg=None)

和 HTML:

<html>
  <head>
    <title></title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="static/bootstrap.min.css" rel="stylesheet" media="screen">
  </head>
  <body>
  <form action="/req" method="POST">
    <input type="text" name="name">
    <input type="submit" value="Submit">
  </form>
  {% if msg %}
    {{ msg }} #empty page
  {% endif %}
    </div>
  </body>
</html>