【问题标题】:Flask session not persisting value set by ajax if there is no return statement如果没有返回语句,烧瓶会话不会持久化 ajax 设置的值
【发布时间】:2018-02-16 03:06:08
【问题描述】:

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

我有一个简单的 ajax 调用来设置 python 烧瓶应用程序的状态,如下所示。

下面是我设置值的方法

-- 设定值--

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'] 保持不变。

我对这种行为感到非常困惑。我想我可以只使用修改来使其工作,但是我真的很犹豫要不要做我不清楚的事情。

我是否必须从烧瓶/python 服务器返回响应才能在请求之间保存会话值?我想我可以使用 ajax post call 在服务器端设置状态,而不需要从服务器返回任何数据。

我还需要向 ajax 调用返回某种成功/失败通知吗?和 session 不保值有什么关系?

有人可以解释一下这种混乱吗?

谢谢!

【问题讨论】:

    标签: javascript python ajax flask


    【解决方案1】:

    每个@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 返回一些有价值的信息将帮助您处理来自 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>
    

    【讨论】:

    • 非常感谢您的帮助。我猜会话没有保持价值,因为我创造了导致事情破裂的错误情况。我之前是桌面和嵌入式开发人员。这个网络应用程序是一个全新的世界。感谢您的帮助!!!!
    猜你喜欢
    • 2013-09-13
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 2011-11-28
    • 1970-01-01
    相关资源
    最近更新 更多