6

正如您可能知道的那样,通常情况下,HTTP 服务器发送的不仅仅是 session_id cookie;但是,httplib2 使用字典处理 cookie,如下所示:

response, content = http.request(url, 'GET', headers=headers)

headers = {'Cookie': response['set-cookie']}

url = 'http://www.example.com/home'   
response, content = http.request(url, 'GET', headers=headers)

那么,如何设置额外的 cookie?如果用字典处理,我不能有双 Cookie 键:S。

谢谢你的时间。

4

4 回答 4

5

Cookie 包含在单个 HTTP 标头中,以分号分隔。例子:

cookie1=value1;cookie2=value2

因此,您需要从服务器发送的 cookie 中构建一个字符串,然后将其设置为Cookie标头。

编辑:实际上,玩了一下 httplib2 并重新阅读你的问题,我不确定你是否真的需要做任何事情来获得你想要的功能。set-cookie从 httplib2 返回的值实际上Set-Cookie是服务器发送的原始标头;您可以将其放入cookie新响应的标题中,一切都会正常工作。从技术上讲,您应该删除一些 cookie 属性,例如expiry,但我想大多数服务器都会处理得很好。

于 2009-11-15T17:47:05.037 回答
3

是的,我刚刚在发出请求时在其他地方发现了有关 Cookie 标头的信息,但是服务器可能会发送多个 Set-Cookie 标头,每个标头带有一个 cookie(以及过期、域等属性)。但是使用 httplib2 中使用的字典系统,我无法真正获取服务器发送的所有可能的 Set-Cookie 标头,但似乎只是最后一个。

那么,还有什么想法:)?

于 2009-11-15T18:14:50.290 回答
2

使用虚拟 setcookie() PHP 页面进行一些额外的测试,我在 3 次测试中生成了以下标题集:

Set-Cookie: chocolate=chips
Set-Cookie: milk=shape


Set-Cookie: chocolate=chips; expires=Sun, 15-Nov-2009 18:47:08 GMT; path=/; domain=thaorius.net; secure; httponly
Set-Cookie: milk=shape


Set-Cookie: chocolate=chips; expires=Sun, 15-Nov-2009 18:46:25 GMT
Set-Cookie: milk=shape

httplib2 在数组的 set-cookie 键上实际提供的输出分别是每个标头对:

chocolate=chips, milk=shape

chocolate=chips; expires=Sun, 15-Nov-2009 18:31:00 GMT; path=/; domain=thaorius.net; secure; httponly, milk=shape

chocolate=chips; expires=Sun, 15-Nov-2009 18:38:21 GMT, milk=shape

所以看起来 httplib2 确实正确地处理了这个问题,但现在我遇到了另一个问题。expires 属性中的“,”。如您所见,cookie 以逗号分隔,但如何与 expires 属性区分。

我可以用逗号分割字符串,然后用“;”分割字符串,最后得到每个 cookie 的键值对,既方便又简单;但是用逗号过期,我不可能这样做。

所以,我在想,我可以使用一个正则表达式,它基本上会查找“expires=letters, num&letters nums:nums:nums absolutechars[,|;|$]” 并将其替换为 expires=STUB 之类的东西,就像我做的那样不太关心cookies的过期时间。

那么,有人会好心给我可以​​提供给 re.sub() 的正则表达式吗?到目前为止,我还没有真正需要正则表达式,因此我还没有学习它们,我真的不想为一个单一的 :) 浪费几天时间。

于 2009-11-15T18:57:48.500 回答
-2

尝试这个:

pp = re.compile('(Sun|Mon|Tue|Wed|Thu|Fri|Sat),')
pp.sub('','alpha Sun, beta')
'alpha  beta'
于 2010-05-21T14:25:45.373 回答