httplib2,如何设置多个cookie?

6 投票
4 回答
4848 浏览
提问于 2025-04-15 16:02

你可能知道,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 个回答

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 属性中的逗号。正如你所看到的,cookies 是用逗号分开的,但我该如何区分 expires 属性中的逗号呢?

我可以通过逗号来分割字符串,然后再用分号分割,最终得到每个 cookie 的键值对,这样简单明了;但是由于 expires 中有逗号,我根本无法这样做。

所以,我在想,我可以使用一个正则表达式,基本上是寻找 "expires=字母, 数字&字母 数字:数字:数字 任意字符[,|;|$]",然后把它替换成类似 expires=STUB 的东西,因为我并不在乎 cookies 的过期时间。

所以,有人愿意帮我提供一个可以用在 re.sub() 中的正则表达式吗?到目前为止我并没有真正需要用到正则表达式,因此我还没学过,我真的不想为一个正则表达式浪费几天时间 :).

3

是的,我刚刚在其他地方了解到,在发请求的时候会有一个叫做Cookie的头信息。不过,服务器可能会发送多个Set-Cookie头,每个头里会有一个cookie(还有过期时间、域名等属性)。但是由于httplib2使用的是字典系统,我其实无法获取到服务器发送的所有Set-Cookie头,似乎只能得到最后一个。

那么,还有其他想法吗?:)

5

Cookies 是通过一个 HTTP 头部来传递的,多个 Cookies 之间用分号隔开。举个例子:

cookie1=value1;cookie2=value2

所以你需要把服务器发送过来的 Cookies 组合成一个字符串,然后把这个字符串设置为 Cookie 头部。

补充说明:其实,稍微玩一下 httplib2 并重新阅读你的问题后,我不太确定你是否真的需要做什么才能实现你想要的功能。你从 httplib2 得到的 set-cookie 值其实就是服务器发送过来的原始 Set-Cookie 头部;你只需要把它放到新响应的 cookie 头部里,一切就会正常工作。严格来说,你应该去掉一些 Cookie 属性,比如 expiry,不过我想大多数服务器会处理得很好。

撰写回答