编程语言
首页 > 编程语言> > python-如何使用金字塔检查浏览器cookie支持

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