【问题标题】:How to check browser cookies support with Pyramid如何使用 Pyramid 检查浏览器 cookie 支持
【发布时间】:2012-03-06 15:56:56
【问题描述】:

我想知道什么时候合适,以及如何检查浏览器 cookie 支持。

我知道我必须检查下一个请求,例如,使用烧杯查找会话密钥 _creation_timerequest.headers['Cookie']... 如果未找到则引发异常,但我不想这样做或每个请求的类似内容。我的应用程序的某些部分不需要 cookie,例如主页或信息、常见问题页面...

当用户注销时,会话被删除或失效,我曾经重定向到主视图,如果我当时检查session key,我不会找到它,但这并不意味着有这个问题。

我在登录视图开头使用的示例:

 try: request.headers['Cookie']
 except KeyError:
   return HTTPFound(location=request.route_url('home'))

还请注意,如果我尝试使用request.session.flash(msg, 'error') 打印错误消息或在主页视图的开头再次使用 sn-p 并使用控制返回变量使用模板呈现消息,注销后它将显示错误。

我正在寻找最优雅的方式来解决问题...也许订阅一个事件?...写下一个函数以在某些感兴趣的视图中调用?

【问题讨论】:

    标签: python cookies session-cookies pyramid


    【解决方案1】:

    有几件事可能会导致您的问题。

    在我继续之前...仅供参考 Pyramid 使用 WebOb 来处理请求和响应对象

    场景 1

    如果你在 Pyramid 下调用 set_cookie ,然后做一个重定向, set_cookie 将不会被发送。这是因为重定向创建了一个新的响应对象。

    有几种方法可以解决这个问题:

    1. 最直接的方法是在引发/返回重定向时将响应标头复制到 cookie 中

      return HTTPfound( "/path/to/redirect", headers=[ (k,v) for (k,v)\
      in self.request.response.headers.iteritems() if k == 'Set-Cookie']  )
      

      resp = HTTPFound(location='/path/to/redirect') 
      return self.request.response.merge_cookies(resp) 
      

      我还应该注意,大多数浏览器在重定向时接受 cookie,但 Safari 不接受。

    2. 另一种方法是使用金字塔的钩子在幕后转换 cookie。我写了自动执行此操作的订阅者。他们在 pypi 和 github 上。 https://github.com/jvanasco/pyramid_subscribers_cookiexfer

    场景 2

    在 Pyramid 中有两种处理会话的方法。 Pyramid 有自己的会话库,然后是Beaker,它为 Pylons 处理了sessions,并且有很多人使用的 Pyramid 支持。我不能说pyramid.session,但是 Beaker 有两种终止会话的模式:

    delete()
    Delete the cookie, and clear the session
    
    invalidate()
    Clear the contents and start a new session
    

    如果您调用invalidate(),Beaker 会话 cookie 将保持不变,并且所有会话数据都将被清除——因此您可以开始将新数据存储到一个空会话对象中。

    如果您调用delete(),cookie 会像会话数据一样被杀死。如果您将新信息放入会话 IIRC,它将进入新的 sessionid / cookie 。然而,正如我在上面第一部分中提到的,set_cookie 将被调用,但在重定向期间被抛出。因此,如果您 delete() 会话然后不迁移 set_cookie 标头...客户端将永远不会收到会话标识符。

    金字塔下cookie的一些示例行为

    重定向行为

    • 用户访问网站并获得 cookie:SessionId=1
    • 用户点击登录
      • 应用将登录状态保存到会话“1”
      • 应用使用“LoggedIn=1”调用 set_cookie
      • 应用调用重定向到 /home
      • 重定向已发送,无 cookie
    • 用户登陆 /home
      • 应用只能看到“SessionId=1”的 cookie

    使用重定向删除的行为:

    • 用户点击注销
      • 应用程序在会话中调用“delete()”,终止数据存储并在 request.response 中放置一个 set_cookie 以使旧 cookie 过期。如果创建了新的 sessionid,也会发送。
      • 如果应用呈现响应,则客户端会收到 cookie
      • 如果应用重定向,客户端不会收到标头以使 cookie 过期或设置新的 cookie

    重定向无效的行为:

    • 用户点击注销
      • 应用程序在会话中调用“invalidate()”,杀死数据存储区
      • 应用设置自定义“loggedout=0”cookie
      • 如果应用呈现响应,则客户端会收到 cookie
      • 如果应用重定向:
        • 客户端未收到“loggedout=0”标头
        • 客户端仍有旧的会话 cookie,但它在后端已失效/清除,因此它们被有效锁定。

    旁注:我个人不喜欢使用处理所有标题的request.headers 接口来获取cookie。 request.cookies 的运气更好——它会返回一个 cookie 字典。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-04
      • 2018-06-01
      • 2014-03-27
      • 1970-01-01
      • 2013-01-01
      • 2011-02-24
      • 1970-01-01
      相关资源
      最近更新 更多