2012-11-26 15 views
5

Zajmuję się tworzeniem aplikacji na Google App Engine i napotkam problem. Chcę dodać plik cookie do każdej sesji użytkownika, aby móc odróżnić obecnych użytkowników. Chcę, aby wszyscy byli anonimowi, więc nie chcę logowania. Dlatego zaimplementowałem następujący kod dla plików cookie.Pliki cookie za pomocą Pythona i Google App Engine

def clear_cookie(self,name,path="/",domain=None): 
    """Deletes the cookie with the given name.""" 
    expires = datetime.datetime.utcnow() - datetime.timedelta(days=365) 
    self.set_cookie(name,value="",path=path,expires=expires, 
        domain=domain)  

def clear_all_cookies(self): 
    """Deletes all the cookies the user sent with this request.""" 
    for name in self.cookies.iterkeys(): 
     self.clear_cookie(name)    

def get_cookie(self,name,default=None): 
    """Gets the value of the cookie with the given name,else default.""" 
    if name in self.request.cookies: 
     return self.request.cookies[name] 
    return default 

def set_cookie(self,name,value,domain=None,expires=None,path="/",expires_days=None): 
    """Sets the given cookie name/value with the given options.""" 

    name = _utf8(name) 
    value = _utf8(value) 
    if re.search(r"[\x00-\x20]",name + value): # Don't let us accidentally inject bad stuff 
     raise ValueError("Invalid cookie %r:%r" % (name,value)) 
    new_cookie = Cookie.BaseCookie() 
    new_cookie[name] = value 
    if domain: 
     new_cookie[name]["domain"] = domain 
    if expires_days is not None and not expires: 
     expires = datetime.datetime.utcnow() + datetime.timedelta(days=expires_days) 
    if expires: 
     timestamp = calendar.timegm(expires.utctimetuple()) 
     new_cookie[name]["expires"] = email.utils.formatdate(timestamp,localtime=False,usegmt=True) 
    if path: 
     new_cookie[name]["path"] = path 
    for morsel in new_cookie.values(): 
     self.response.headers.add_header('Set-Cookie',morsel.OutputString(None)) 

Aby przetestować powyższy kod Użyłem następujący kod:

class HomeHandler(webapp.RequestHandler): 
    def get(self): 
     self.set_cookie(name="MyCookie",value="NewValue",expires_days=10) 
     value1 = str(self.get_cookie('MyCookie'))  
     print value1 

Kiedy uruchomić ten nagłówek w pliku HTML wygląda następująco:

Żaden status : 200 OK Content-Type: text/html; charset = utf-8 Cache-Control: no-cache Set-Cookie: MyCookie = NewValue; wygasa = czw, 06 grudnia 2012 17:55:41 GMT; Ścieżka =/ Długość treści: 1199

"Brak" w powyższym opisie odnosi się do "wartości1" z kodu.

Czy możesz mi powiedzieć, dlaczego wartość cookie to "Brak", nawet jeśli jest dodana do nagłówka?

Twoja pomoc jest bardzo cenna.

Odpowiedz

3

Po wywołaniu set_cookie(), ustawia cookie na przygotowywanej odpowiedzi (to znaczy ustawia plik cookie po wysłaniu odpowiedzi, po powrocie funkcji). Kolejne wywołanie get_cookie() jest odczytywane z nagłówków bieżącego żądania. Ponieważ bieżące żądanie nie zawiera zestawu plików cookie, którego testujesz, nie będzie ono odczytywane. Jeśli jednak powrócisz na tę stronę, powinieneś otrzymać inny wynik, ponieważ plik cookie będzie teraz częścią żądania.

+0

Dziękuję bardzo za odpowiedź, ale niestety nie otrzymuję innego wyniku, gdy ponownie odwiedzam stronę. Jestem otwarty na inne sugestie? – Maal

+0

Przepraszamy. Właśnie zdałem sobie sprawę, że jesteś w 100% poprawny. Dziękuję Ci bardzo. – Maal