将flask会话变量传递给不同的视图会返回None类型

时间:2016-03-02 07:31:58

标签: javascript python json session flask

我正在尝试将在登录视图上设置的会话变量传递给另一个视图。但是,如果提交表单,则会话变量始终返回None,我希望会话变量保留。

工具页面有一些表单字段,还有一个文本框可以根据会话['foo']处理自动完成搜索,该会话是在良好的登录状态下发送的。

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        # Get some form variables here
        if login is valid:
            login_user(user, remember=True)
            session['foo'] = utils.get_data()
            return redirect(url_for('tools'))
    return render_template('login.html')

@app.route("/tools", methods=['GET', 'POST'])
@login_required
def tools():
    if session['foo'] is None:
        print "Data is None type, getting data"
        session['foo'] = utils.get_data()

    if request.method == 'POST':
        # Handling some forms here
        # If one of these forms are submitted, session['foo'] is set to None :(

    return render_template('tools.html', foo_data=session['foo'])

Utils.py

def get_data():
    response = requests.post(url, data=data)  # FYI, server won't allow GET for this call.
    # Do json type stuff here to make response.content nice for javascript
   return response

基本上,这段代码发生的事情是,每次提交表单时,我都要检查它是否为None并调用utils.get_data(),我希望此方法返回的数据保留整个长度的会话。

编辑: 解决方案,会话变量对象太大了。解决这个问题的一些方法可能包括:

  • 使用AJAX避免每次提交刷新页面,因此不会刷新会话对象
  • 将对象拆分为较小的块
  • 避免在Cookie中存储大型对象 - 使用本地存储

2 个答案:

答案 0 :(得分:1)

检查要放入会话的数据大小。如果它太大,请尝试使用较小的物体。

来自documentation

  

关于基于cookie的会话的注释:Flask将获取您放入会话对象的值并将它们序列化为cookie。如果您发现某些值不会在请求中保留,则确实启用了Cookie,并且您没有收到明确的错误消息,请检查页面响应中的Cookie大小与Web浏览器支持的大小相比。

原帖:

  

从技术上讲,utils.get_data方法是一个与Web调用不同的会话。尝试实现的获取数据方法是什么?

答案 1 :(得分:0)

如果数据大小有问题,您还可以创建服务器端会话。 可以在您的数据库中存储Flask会话,只需将会话ID存储在cookie中。

例如,此snippet显示了如何在MongoDB中存储会话数据。