【问题标题】:httplib2, how to set more than one cookie?httplib2,如何设置多个cookie?
【发布时间】:2009-11-15 17:42:55
【问题描述】:

您可能知道,通常情况下,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.

感谢您的宝贵时间。

【问题讨论】:

  • 我建议阅读 http rfc:w3.org/Protocols/rfc2616/rfc2616.html 和 cookie rfc:faqs.org/rfcs/rfc2109.html。你可能不认为你应该为了这个小任务而接触这些文档,但实际上,既然你显然在做某种网络编程,你应该理解这些重要的概念。
  • 我肯定会在几天后有更多时间阅读它们,我将链接添加为书签。谢谢。

标签: python cookies httplib2 cookiejar


【解决方案1】:

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

cookie1=value1;cookie2=value2

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      做一些额外的测试,使用一个虚拟的 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 之类的内容,因为我并不关心 cookie 的过期时间。

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

      【讨论】:

        【解决方案4】:

        试试这个:

        pp = re.compile('(Sun|Mon|Tue|Wed|Thu|Fri|Sat),')
        pp.sub('','alpha Sun, beta')
        'alpha  beta'
        

        【讨论】:

          猜你喜欢
          • 2019-09-24
          • 2012-12-18
          • 1970-01-01
          • 2015-10-28
          • 1970-01-01
          • 1970-01-01
          • 2021-08-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多