python session 更新
在使用python的session的时候,我在xsession中定义了一个字典,首次字典内的值更新会正常的存储在浏览器的cookie中,但是在修改字典中的值后,再次访问session会发现访问出来的数据是未修改之前的
翻了一些资料,原因大概如下
- 首先我们知道,python的session是通过secret_key加密后存储到cookie中的,所以首次设置的值会直接存储在浏览器的cookie中
- 如果是修改session直接映射的值,session还是可以识别到的,比如
@app.route('/sets')
def sets():
session['test']=10
return json.dumps(session['test'], ensure_ascii=False, encoding='UTF-8')
@app.route('/updates')
def updatas():
session['test']=11
return json.dumps(session['test'], ensure_ascii=False, encoding='UTF-8')
@app.route('/reads')
def reads():
return json.dumps(session['test'], ensure_ascii=False, encoding='UTF-8')
-
运行后在浏览器中访问
- http://x.x.x.x:8080/sets 返回为10
- http://x.x.x.x:8080/reads 返回为10
- http://x.x.x.x:8080/updates 返回为11
- http://x.x.x.x:8080/reads 返回为11
-
如果我们修改的是session映射的字典或者列表中的值,效果可就变了,看一下代码
@app.route('/sets')
def sets():
session['test']={'a':1,'b':2}
return json.dumps(session['test'], ensure_ascii=False, encoding='UTF-8')
@app.route('/updates')
def updatas():
session['test']['c']=3
return json.dumps(session['test'], ensure_ascii=False, encoding='UTF-8')
@app.route('/reads')
def reads():
return json.dumps(session['test'], ensure_ascii=False, encoding='UTF-8')
- 运行后再浏览器中访问
- http://x.x.x.x:8080/sets 返回为{"a": 1, "b": 2}
- http://x.x.x.x:8080/reads 返回为{"a": 1, "b": 2}
- http://x.x.x.x:8080/updates 返回为{"a": 1, "c": 3, "b": 2}
-
http://x.x.x.x:8080/reads 返回为{"a": 1, "b": 2}
这个就有点尴尬了,本来打算用session直接存储数据的,现在踩坑了.. 不我不会放弃的
仔细一想,不确定对不对,大神看了求指点。session映射字典,映射的是字典的本身的标识,
而不是具体字典中的数据,所以在更新字典内的数据时,字典本身不会发生变化,所以session
无感知故session不更新客户端cookie中的数据。
那么怎么解决呢?一个参数搞定session.modified = True
,主动的告诉session这个
数据有更新,看一下代码执行的反馈。
@app.route('/sets')
def sets():
session['test']={'a':1,'b':2}
return json.dumps(session['test'], ensure_ascii=False, encoding='UTF-8')
@app.route('/updates')
def updatas():
session['test']['c']=3
session.modified = True
return json.dumps(session['test'], ensure_ascii=False, encoding='UTF-8')
@app.route('/reads')
def reads():
return json.dumps(session['test'], ensure_ascii=False, encoding='UTF-8')
- 运行后再浏览器中访问
- http://x.x.x.x:8080/sets 返回为{"a": 1, "b": 2}
- http://x.x.x.x:8080/reads 返回为{"a": 1, "b": 2}
- http://x.x.x.x:8080/updates 返回为{"a": 1, "c": 3, "b": 2}
- http://x.x.x.x:8080/reads 返回为{"a": 1, "c": 3, "b": 2}
网友评论