2012-05-13 62 views
1
class ... 
self.response.headers.add_header('Set-Cookie','user_id = %s'% id_and_hash) 
     self.redirect("/app/login") 

class ThanksHandler(webapp2.RequestHandler): 
    def get(self): 
     if 'user_id' in self.request.cookies: 
      self.response.out.write('user_id') 
     else: 
      self.response.out.write("wrong") // what i am getting 

後,我有這個cookie(我在餅乾的經理看到的)檢索cookie重定向

name: user_id 
content: 30|a9bdc98e952c0e787aaf0e5466809eea71635d38446d30a9f71f2d15e99fa701 

很好,基本的問題是,我不能檢索已初始化的餅乾。有什麼理由呢?

+1

爲什麼不使用['response.set_cookie'](http://webapp-improved.appspot.com/guide/response.html#setting-cookies)調用?我的猜測是:你的Set-Cookie頭沒有設置「路徑」,因此瀏覽器使用了通過Set-Cookie頭進行響應的路徑(參見[RFC 2109,第4.3.1節](http://tools.ietf。組織/ HTML/RFC2109#部分-4.3.1))。如果您現在重定向到其他路徑,瀏覽器將不會發送cookie,因爲路徑不匹配。如果將格式字符串更改爲''user_id =%s; Path = /''(也許空格是問題) – vstm

+0

@vstm你是對的。請添加爲答案。我會接受它。 – user1311784

回答

3

當使用「Set-Cookie」HTTP標頭直接設置cookie時,您還必須處理cookie屬性(取決於您要如何使用cookie)。

在這種情況下,您將Cookie設置爲路徑/app/auth,然後重定向到/app/login。如果您沒有明確指定cookie路徑,瀏覽器將採用/app/auth,因此在請求/app/login時不會發送cookie。這種行爲在RFC 6265中指定(這比我在我的評論中引用的更新,但現在確切的算法已包含在第5.1.4節中)。

要設置路徑(或任何其他cookie屬性),您可以附加一個由分號分隔的名稱=值對列表。在這種情況下,你要的路徑設置爲/(也可能是像/app不同):

self.response.headers.add_header('Set-Cookie','user_id=%s; Path=/'% id_and_hash) 

當然大多數圖書館/框架已經提供了「設置Cookie」頭的包裝。在「webapp2的」的情況下,你可以用response.set_cookie設置Cookie:

self.response.set_cookie('user_id', id_and_hash) 

它的路徑會自動設置爲/,所以你不必擔心它(它不正確轉義值太)。