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

时间:2015-03-16 17:50:24

标签: python ajax flask

问题出在我收到请求并将值分配给变量msg后,我的模板login.html仍然为空,我希望看到消息=&#39;得到它&#39;。< / p>

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>

1 个答案:

答案 0 :(得分:2)

看起来你正在混淆模板渲染和Ajax。

您的JavaScript test函数 在后端调用您的req视图方法, 渲染模板,但您'我没有对该模板做任何事情。

您尝试在模板中打印的msg# empty page变量将永远不会被渲染,因为没有msg变量不是None变量1}}在渲染基础模板时。 msg由POSTing通过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)

在你的Ajax调用中,

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>