使用下面的应用程序和Flask 0.11.1,我导航到与以下函数调用关联的路由,并给出了以下结果:
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 question,this和this one,但我设置的是密钥而不是重新生成它,而且我的变量肯定不会大于允许cookie的4096字节。也许我错过了一些关于Flask会话变量的基本理解?
答案 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,则需要服务器端 Session。看看Flask-Session。