python session 更新
在使用python的session的時(shí)候酪穿,我在xsession中定義了一個(gè)字典柏腻,首次字典內(nèi)的值更新會(huì)正常的存儲(chǔ)在瀏覽器的cookie中诺擅,但是在修改字典中的值后晨横,再次訪問(wèn)session會(huì)發(fā)現(xiàn)訪問(wèn)出來(lái)的數(shù)據(jù)是未修改之前的
翻了一些資料,原因大概如下
- 首先我們知道鸠天,python的session是通過(guò)secret_key加密后存儲(chǔ)到cookie中的,所以首次設(shè)置的值會(huì)直接存儲(chǔ)在瀏覽器的cookie中
- 如果是修改session直接映射的值讼育,session還是可以識(shí)別到的,比如
@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')
-
運(yùn)行后在瀏覽器中訪問(wèn)
- 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')
- 運(yùn)行后再瀏覽器中訪問(wèn)
- 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}
這個(gè)就有點(diǎn)尷尬了奶段,本來(lái)打算用session直接存儲(chǔ)數(shù)據(jù)的,現(xiàn)在踩坑了.. 不我不會(huì)放棄的
仔細(xì)一想剥纷,不確定對(duì)不對(duì)痹籍,大神看了求指點(diǎn)。session映射字典晦鞋,映射的是字典的本身的標(biāo)識(shí)蹲缠,
而不是具體字典中的數(shù)據(jù),所以在更新字典內(nèi)的數(shù)據(jù)時(shí)鳖宾,字典本身不會(huì)發(fā)生變化吼砂,所以session
無(wú)感知故session不更新客戶端cookie中的數(shù)據(jù)逆航。
那么怎么解決呢鼎文?一個(gè)參數(shù)搞定session.modified = True
,主動(dòng)的告訴session這個(gè)
數(shù)據(jù)有更新,看一下代碼執(zhí)行的反饋因俐。
@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')
- 運(yùn)行后再瀏覽器中訪問(wèn)
- 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}