gpt4 book ai didi

python - 如何使用 Pyramid 检查浏览器 cookies 支持

转载 作者:行者123 更新时间:2023-11-28 16:49:30 25 4
gpt4 key购买 nike

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

我知道我必须检查下一个请求,例如,使用烧杯查找 session key _creation_timerequest.headers['Cookie'].. . 并在未找到时引发异常,但我不想对每个请求都这样做或做类似的事情。我的应用程序的某些部分不需要 cookie,例如主页或信息、常见问题页面...

当用户注销时, session 被删除或失效,我曾经重定向到主页 View ,如果我在那一刻检查 session key ,我不会找到它但它并不意味着存在这个问题。

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

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

另请注意,如果我尝试使用 request.session.flash(msg, 'error') 打印错误消息或在主页 View 的开头再次使用代码片段并呈现使用控件返回变量的模板消息,注销后将错误显示。

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

最佳答案

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

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

场景一

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

有几种解决方法:

  1. 最直接的方法是在引发/返回重定向时将响应 header 复制到 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. 另一种方法是使用 Pyramid 的钩子(Hook)在幕后转换 cookie。我写了自动执行此操作的订户。他们在 pypi 和 github 上。 https://github.com/jvanasco/pyramid_subscribers_cookiexfer

场景二

在 Pyramid 中有两种处理 session 的方法。 Pyramid有自己的session库,然后就是Beaker , 它处理了 sessions用于 Pylons 并具有许多人使用的 Pyramid 支撑。我不能说 pyramid.session,但是 Beaker 有两种模式来终止 session :

delete()
Delete the cookie, and clear the session

invalidate()
Clear the contents and start a new session

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

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

Pyramid 下cookie的一些行为示例

重定向行为

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

使用重定向删除的行为:

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

invalidate with redirect 的行为:

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

旁注:我个人不喜欢使用 request.headers 接口(interface)(它处理所有 header )来获取 cookie。我在 request.cookies 方面运气更好——它返回一个 cookie 字典。

关于python - 如何使用 Pyramid 检查浏览器 cookies 支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9291178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com