python-如何使用金字塔检查浏览器cookie支持
作者:互联网
我想知道什么时候才是合适的时机,以及如何检查浏览器cookie的支持.
我知道我必须检查下一个请求,例如,用烧杯,查找会话密钥_creation_time或request.headers [‘Cookie’] …并引发异常(如果找不到),但我不想这样做或类似的要求.我的应用程序的某些部分不需要Cookie,例如主页或信息,常见问题页面…
当用户注销时,会话将被删除或无效,并且我曾经重定向到主视图,如果那时候检查会话密钥,我将找不到它,但这并不意味着存在此问题.
我在登录视图开始时使用的一个示例:
try: request.headers['Cookie']
except KeyError:
return HTTPFound(location=request.route_url('home'))
另请注意,如果我尝试使用request.session.flash(msg,’error’)打印错误消息,或者在主视图的开头再次使用该代码段,并使用控件返回变量使用模板呈现消息,注销后将显示错误.
我正在寻找解决问题的最优雅方法…也许订阅了一个事件?…写下一个在感兴趣的视图中调用的函数?
解决方法:
有些事情可能会导致您的问题.
在继续之前… FYI Pyramid使用WebOb处理请求和响应对象
> WebOb Overview
> WebOb Class Documentation
场景1
如果您在Pyramid下调用set_cookie,然后进行重定向,则不会发送set_cookie.这是因为重定向会创建一个新的响应对象.
有几种解决方法:
>最直接的方法是在引发/返回重定向时将响应标头复制到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)
我还要注意,MOST浏览器在重定向上接受cookie,但是Safari不能.
>另一种方法是使用金字塔的钩子在后台转换cookie.我写了使这个自动化的订户.他们在pypi和github上. https://github.com/jvanasco/pyramid_subscribers_cookiexfer
方案2
在金字塔中有两种处理会话的方法. 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将被调用,但在重定向过程中将被丢弃.因此,如果您删除()会话,然后不迁移set_cookie标头,则客户端将永远不会收到会话标识符.
金字塔下Cookie的一些示例行为
重定向行为
>用户访问网站并获得Cookie:SessionId = 1
>用户点击登录
>应用程序将登录状态保存到会话“ 1”
>应用使用“ LoggedIn = 1”调用set_cookie
>应用程序调用重定向到/ home
>重定向发送,没有cookie
>用户登陆到/ home
>应用仅看到“ SessionId = 1”的Cookie
带有重定向的删除行为:
>用户点击注销
>应用程序在会话上调用“ delete()”,终止数据存储并将set_cookie放入request.response中以使旧的cookie过期.如果创建了新的sessionid,也将发送它.
>如果应用提供响应,则客户端会收到Cookie
>如果应用重定向,则客户端不会收到标头以使Cookie过期或设置新的标头
带有重定向无效的行为:
>用户点击注销
>应用程序在会话上调用“ invalidate()”,从而杀死了数据存储区
>应用设置了自定义的“ loggedout = 0” cookie
>如果应用提供响应,则客户端会收到Cookie
>如果应用重定向:
>客户端未收到“ loggedout = 0”标头
>客户端仍然具有旧的会话cookie,但是在后端无效/清除了该cookie,因此实际上已将它们锁定.
旁注:我个人不喜欢使用request.headers接口(处理所有标头)来获取Cookie.我对request.cookies更好了-它返回了一个cookie字典.
标签:cookies,pyramid,session-cookies,python 来源: https://codeday.me/bug/20191201/2083021.html