每 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>
问题是在我收到请求并将值赋给变量 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>