Flask会话变量在请求之间不存在

时间:2016-09-01 01:08:37

标签: python session flask

使用下面的应用程序和Flask 0.11.1,我导航到与以下函数调用关联的路由,并给出了以下结果:

  • create():'1,2,3'#OK
  • 删除(1):'2,3'#确定
  • 删除(2):'1,3'#expected'3'
  • maintain():'1,2,3'#expected'1,3'或'3'

from flask import Flask, session

app = Flask(__name__)

@app.route('/')
def create():
    session['list'] = ['1','2','3']
    return ",".join(session['list'])

@app.route('/m')
def maintain():
    return ",".join(session['list'])

@app.route('/r/<int:id>')
def remove(id):
    session['list'].remove(str(id))
    return ",".join(session['list'])

if __name__ == '__main__':
    app.secret_key = "123"
    app.run()

这个问题在主题上类似于this questionthisthis one,但我设置的是密钥而不是重新生成它,而且我的变量肯定不会大于允许cookie的4096字节。也许我错过了一些关于Flask会话变量的基本理解?

3 个答案:

答案 0 :(得分:11)

来自the doc

  

请注意,不会自动拾取可变结构的修改,在这种情况下,您必须自己明确地将[modified属性]设置为True

尝试:

session['list'].remove(str(id))
session.modified = True

答案 1 :(得分:7)

Flask使用CallbackDict来跟踪对会话的修改。

只有在设置或删除密钥时才会注册修改。在这里,您可以修改它不会检测到的值。试试这个:

@app.route('/r/<int:id>')
def remove(id):
    val = session['list']
    val.remove(str(id))
    session['list'] = val
    return ",".join(session['list'])

...与其他更改相同,或者您可能尝试自己设置session.modified = True,而不是触发检测。

答案 2 :(得分:0)

我遇到了同样的问题,我发现我在会话中的更改没有持久化,因为我的数据太大了。

来自here

"默认情况下,Flask 中的 cookie 和基于客户端的会话之间没有太大区别。因此,基于客户端的会话遭受与 cookie 相同的缺点:< /p>

  • 无法存储密码等敏感数据。
  • 每个请求的额外负载。
  • 不能存储超过 4KB 的数据。
  • 限制每个网站的 cookie 数量等。

如果您的数据大于 4KB,则需要服务器端 Session。看看Flask-Session