如果正在加载其他页面,则#pyramid注销无法删除会话

时间:2019-01-31 07:54:01

标签: session pyramid beaker

我的网站使用金字塔,并包含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

如果操作速度较慢,请等待第二页加载完成,然后注销,两个页面都将注销
我完全感到困惑,为什么第二页会影响从会话中清除日志信息?

1 个答案:

答案 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。

种族条件是会话中的一个已知问题,只是生活中的事实,除非您采取诸如锁之类的额外预防措施,但大多数情况下这都不值得。