2010-02-19 33 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 
    #-----------------------------------------------