我是网络应用的新手,如果这个问题完全不合时宜,我很抱歉。
我有一个简单的 ajax 调用来设置 python flask 应用程序的状态,如下所示。
下面是我如何设置值
-- 设置值--
Javascript (page1.html)
function foo(val1, val2){
$.ajax({
url: "./set_option",
type: "POST",
data: {arg1:val1, arg2:val2}
});
}
python 端
@app.route('/set_option', methods=['post'])
def set_option():
session['val1'] = request.form.get('arg1')
session['val2'] = request.form.get('arg2')
下面是我如何尝试用这个值做一些事情
-- 检索值 --
Javascript (page2.html)
function do_something_with_store_value(){
$.ajax({
url:"./print_them",
type: "POST"
});
}
python 端
@app.route('/print_them', methods=['post'])
def print_them():
print(session['val1'])
print(session['val2'])
在上面的例子中,我看到 session['val1'] 和 session['val2'] 在 def print_them() 中不存在>。但是,如果我修改 function foo(val1, val2) 来处理返回响应和 def set_option() 来返回一个简单的字符串值 session['val1'] 和 session['val2'] 保持不变。
我对这种行为感到很困惑。我想我可以直接使用修改使其工作,但我真的很犹豫要不要做我不明白的事情。
我是否必须从 flask/python 服务器返回响应才能在请求之间保存 session 值?我以为我可以使用 ajax post 调用在服务器端设置状态,而不需要从服务器返回任何数据。
我是否还需要向 ajax 调用返回某种成功/失败通知?和session不保值有什么关系?
有人可以阐明这种困惑吗?
谢谢!
最佳答案
每个 @app.route
装饰器都应该返回一些东西。
看下面的案例。
app.py
:
from flask import Flask, request
app = Flask(__name__)
@app.route('/test')
def test():
print("hello from test")
if __name__ == '__main__':
app.run(debug = True)
当我试图访问http://localhost:5000/test
时,它显示
builtins.ValueError
ValueError: View function did not return a response
调用 AJAX 调用时会创建完全相同的场景。此外,从 Flask 返回一些有值(value)的信息将帮助您处理来自 jQuery 代码的错误。
这是我用来消除问题的更新代码。
app.py
:
from flask import Flask, request, render_template, session, jsonify
app = Flask(__name__)
app.secret_key = "secret key"
@app.route('/set_session', methods = ['POST'])
def set_session():
if request.method == 'POST':
val1 = request.form.get('arg1')
val2 = request.form.get('arg2')
session['val1'] = val1
session['val2'] = val2
return 'session is set'
@app.route('/get_session', methods = ['GET'])
def get_session():
if request.method == 'GET':
data = {}
try:
data['val1'] = session['val1']
data['val2'] = session['val2']
except:
pass
return jsonify(data)
@app.route('/', methods = ['GET', 'POST'])
def index():
return render_template('ajax.html')
if __name__ == '__main__':
app.run(debug = True)
templates/ajax.html
:
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
</head>
<body>
<h3>Session in Flask</h3>
<div id="session_value"></div>
<script>
$(document).ready(function(){
$.ajax({
url: '/set_session',
type: 'POST',
data: {arg1: 'updated value 1', arg2: 'updated value 2'},
success: function(result){
$("#session_value").append(result);
},
error: function(result){
$("#session_value").append(result);
}
});
$.ajax({
url: '/get_session',
type: 'GET',
dataType: 'json',
success: function(result){
$("#session_value").append("Val1: "+result.val1);
$("#session_value").append("Val2: "+result.val1);
},
error: function(result){
$("#session_value").append(result);
}
});
})
</script>
</body>
</html>
关于javascript - 如果没有返回语句,Flask session 不会保留由 ajax 设置的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48819513/