前些日子,用web2py做一个自我日常管理的网站,发现cookie这关死活过不了,思路很简单:
从request获取cookie 然后读取值(没有该cookie则创建)
修改cookie的值,送到response中,这样完成了一次更新
就是这么简单的一个问题,却出现各种奇怪的问题,为难了一段时间,开始觉得网上的API说明太少了,官方的例子也特别的稀少,如今做android和网站交互的时候,只能打开了web2py的服务器来测试android客户端,一时灵感,想解决这个问题,以下是说明和解决方案。
直接调用
response.cookies['your key'] 这样获取值,总是会有问题,但是关注官网的例子,就会发现其实是esponse.cookies['your key'] .value
那么cookies['key']到底得到了什么,为什么操作不正确呢,做了一个测试,直接return这个 response.cookies['your key']
其结果是这样的
这是什么,web2py框架自动的给这个返回值加了默认布局器,所以完全可以认为返回的是dict对象,不然web2py不会作这一步处理,如果不知道默认布局是什么看起来会非常费劲,因此我对这个值进行遍历,代码如下:
{{=len(result)}}
<br>
{{num=1}}
{{ for i in result:}}
{{=num}} {{=i}}
<br>
{{num=num+1}}
{{pass}}
{{=result.value}}
这是标准的web2py代码,结果如下:
8
1 comment
2 domain
3 secure
4 expires
5 max-age
6 version
7 path
8 httponly
71
即这个返回的单个cookie含有一个71的值,还有8个各种默认的变量,实际上是也是dict对象,只是没有打印出值来,不指定的时候应该也是空的。
trick就在读取cookie的时候需要这样cookies['key'].value
写的时候要这样cookies['key']=some value
下面贴出记录访问次数的代码
def CookieOperatorTest(): if request.cookies.has_key('my'): s = 'You are ' + request.cookies['my'].value + ' come!' response.cookies['my'] = 1 + string.atoi(request.cookies['my'].value) return s else: response.cookies['my']=1; return 'You are first come!'