javascript - 如果没有返回语句,Flask session 不会保留由 ajax 设置的值

标签 javascript python ajax flask

我是网络应用的新手,如果这个问题完全不合时宜,我很抱歉。

我有一个简单的 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/

相关文章:

javascript - 如何将 json 键解析为 json 对象

javascript - 如何从异步调用返回响应?

javascript - 从 node.js 脚本中止 npm 构建脚本

javascript - nodejs等待函数执行

javascript - Angular 完美滚动条在负载下不起作用

php - 使用 Jquery/$.ajax 和 php 进行验证

ajax - 在没有 View 的情况下仅在 FW1 中使用 Controller

javascript - 如何使用 nightwatch.js 中的链接文本单击链接

python - SQLAlchemy - 如何使预加载计数属性

python - 从 txt 文件创建数组