我的网站使用金字塔,并包含pyramid_beaker来使用会话来判断客户端是否已登录。
现在我遇到一个问题:我登录一个网页并打开一个新选项卡,如果我在第二页全部加载之前注销第一页(成功重定向到登录页),然后刷新两页,两者都被记录,与我的期望完全不同。我以为两个页面都应该注销
我的代码就像:
@view_defaults(route_name='/')
class client:
def __init__(self, request)
self.rq = request
if self.rq.session.get("loginfo", {}).get("logged") == "1":
# logged, do something
else:
# not logged, raise Httpfound
@view_config(...)
def login(self):
self.rq.session["loginfo"] = {"logged": "1"}
@view_config(...)
def logout(self)
if "loginfo" in self.rq.session:
del self.rq.session["loginfo"]
ini中的配置
session.type = memory
session.key = mykey
session.secret = mysecret
session.data_dir = %(here)s/data/sessions/data
session.lock_dir = %(here)s/data/sessions/lock
session.timeout = 7200
如果操作速度较慢,请等待第二页加载完成,然后注销,两个页面都将注销
我完全感到困惑,为什么第二页会影响从会话中清除日志信息?
答案 0 :(得分:1)
会话是一无所有的数据更新。可能正在发生的是:
s0 = original session with login info
request1.session = copy(s0) and set logout
request2.session = copy(s0) and do other things
save request1.session
save request2.session
最终结果是没有设置注销的request2.session。
种族条件是会话中的一个已知问题,只是生活中的事实,除非您采取诸如锁之类的额外预防措施,但大多数情况下这都不值得。