我在使用Pylons时遇到response.set_cookie的问题
我在想,Pylons的某个版本可能和其他版本不一样,但我找不到简单的方法来确认我正在使用哪个版本。在第一个例子中,我很确定它是0.9.7及以上版本,使用webob来设置cookie。在这个环境中,@符号被设置成了\100。正如你在另一个环境中看到的,做完全相同的事情时,值被正确设置了。如果你需要更多信息,请告诉我,我会很感激你的帮助。
我觉得新版的Pylons设置值时出现了错误
response.set_cookie('email', 'user@domain.com', max_age=3600)
response.headers
ResponseHeaders([('Content-Type', 'text/html; charset=utf-8'), ('Content-Length','0'),
('Pragma', 'no-cache'), ('Cache-Control', 'no-cache'), ('Set-Cookie',
'email="user\\100domain.com"; expires="Fri, 03-Jun-2011 21:07:07 GMT"; Max-Age=3600; Path=/')])
测试环境正常工作,符合预期
response.set_cookie('email', 'user@domain.com', max_age=3600)
response.headers
HeaderDict([('Content-Type', 'text/html; charset=utf-8'), ('Content-Length', '0'),
('Pragma', 'no-cache'), ('Cache-Control', 'no-cache'), ('Set-Cookie',
'email=user@domain.com; expires="Fri, 03-Jun-2011 21:07:35 GMT"; Max-Age=3600; Path=/')])
1 个回答
1
这是因为webob的新版出现了问题。
在pylons 0.9.7中,webob包的版本大约是0.9.8,这个版本没有对cookie的值进行转义处理。
在这段时间里,webob开始对这些值进行转义,这就导致你现在用的“新”版本出现了问题。如果你深入查看webob的代码(新版),你会发现问题出在Cookie的serialize()方法里,它确保值被正确转义。而旧版本直接设置这些值,没有在序列化时进行转义。
我也有一个类似的环境,使用的是0.9.7版本,并且在虚拟环境中运行,所以我能在我的系统上复现这个问题。
只要你使用的是同一版本的方法,它们也应该在请求中对值进行解转义,所以应该没问题。