2010-02-19 34 views
0

我希望“检索”我的子类BaseHTTPRequestHandler中的客户端发送的Cookie。使用Python的Cookie和HTTP

首先我不能确定发送消息头的,在典型的HTTP请求和响应的精确序列的,这是我的事件序列的认识:

  1. 客户端发送请求(方法,路径,HTTP版本,主机和所有标题)。
  2. 服务器响应一个响应代码,然后是一堆自己的头文件。
  3. 服务器然后发送响应的主体。

何时发送客户端的POST数据?如上所述,在这个序列中是否有重叠?

第二,什么时候可以安全地假设服务器接收到“Cookie”头部。在服务器调用self.send_response的时间之前是否应该收到所有的客户端头文件?在HTTP通信中是否适合查看self.headers中的Cookie标头?

第三,是解析Python中cookie的规范方法。我目前认为应该实例化一个Cookie.SimpleCookie,然后从cookie标头中获取数据。进一步解决这个问题,Cookie类在处理HTTPRequestHandler接口时很笨拙。为什么从Cookie.output()输出不是以行终止结束以适应self.wfile.write(cookie.output()),或代替降隐含提供的头名很好地融入self.send_header("Set-Cookie", cookie.output())

最后,Cookie模块中的饼干类,给予错觉,他们”词典的字典。分配给cookie中的不同键,不会将更多的数据打包到cookie中,而是生成更多的cookie ...显然在一个类中,并且每个都生成它自己的Set-Cookie头。将值容器包装到cookie中的最佳做法是什么?

回答

2

HTTP是一个请求/响应协议,没有重叠; POST的正文是请求的一部分(当然当动词是POST时)。

所有标头还配备作为请求的一部分,包括Cookie:如果任何(有可能是当然没有这样的报头,例如,当浏览器与cookies运行禁用或其它)。所以,只要您收到请求并提供服务,就可以在标题中查看。

我不确定你的“第三”问题是什么。如果没有新行被插入,如果没有一个是cookie的一部分 - 为什么它应该是? 编辑:请参阅稍后。

关于第四点,我认为你可能会将cookies与“少量”混淆。 HTTP响应中Set-Cookie头的数量没有限制,为什么会出现这种问题?

编辑:您可以选择传递给output多达三个参数:集一口属性您在输出每一口希望(默认None表示所有的属性),你想在前面使用的头部字符串每个元素(默认Set-Cookie:),您想要的元素之间的分隔符字符串(默认\r\n)。如此看来,您打算如何使用一个Cookie的是单一口(否则你不能坚持字符串表示成一个头,你似乎最热衷于做的):在这种情况下

thecookie.output(None, '') 

会给你正是你想要的字符串。只需制作多个SimpleCookie实例,每个实例只有一个(因为一个元素是适合单个标头的!)。

+0

第三:没有“简洁”的方式将cookie发送回用户。如上所述,Cookie必须手动抢夺其隐式标题或手动附加的'\ r \ n',然后手动_write_到self.wfile,尽管cookie显然是标题 – 2010-02-19 01:38:02

+0

@Matt,我看到,让我编辑A来澄清。 – 2010-02-19 02:18:23

0

下面是一个快速获取没有第三方库的cookie的方法。虽然它只回答问题的一部分,但它可能会回答大多数“访问者”将会遇到的问题。

import Cookie 

def do_GET(self): 
    #----------------------------------------------- 
    cookies = {} 
    cookies_string = self.headers.get('Cookie') 
    if cookies_string: 
     cookies = Cookie.SimpleCookie() 
     cookies.load(cookies_string) 
    #----------------------------------------------- 
    if 'my-cookie' in cookies: 
     print cookies['my-cookie'].value 
    #-----------------------------------------------