2012-05-13 57 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) 

它的路径会自动设置为/,所以你不必担心它(它不正确转义值太)。