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



问题是在我收到请求并将值分配给变量之后,msg我的模板login.html仍然为空,我想看到消息='知道了'。

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)

登录.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 view 方法,该方法呈现模板,但您没有对该模板执行任何操作。

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

如果您的目标是只查看页面上的msg输出,请让您的req方法在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)

在你的阿贾克斯电话中,

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

如果你真的想返回你在问题中写的模板,你最好提交一个表单而不是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>

最新更新