2012-11-26 13 views
5

Ich entwickle eine App auf der Google App Engine und habe ein Problem festgestellt. Ich möchte jeder Benutzersitzung ein Cookie hinzufügen, damit ich zwischen den aktuellen Benutzern unterscheiden kann. Ich möchte, dass sie alle anonym sind, also möchte ich kein Login. Daher habe ich folgenden Code für Cookies implementiert.Cookies mit Python und 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)) 

den obigen Code zu testen, habe ich den folgenden Code verwendet:

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 

Wenn ich dies in der HTML-Datei der Header laufen sieht wie folgt aus:

Keine -Status : 200 OK Inhaltstyp: text/html; charset = utf-8 Cache-Steuerung: kein Cache Set-Cookie: MyCookie = NewValue; abläuft = Do, 06 Dec 2012 17:55:41 GMT; Path =/ Content-Length: 1199

"None" in der oben bezieht sich auf die "Wert1" aus dem Code.

Können Sie mir bitte sagen, warum der Cookie-Wert "None" ist, auch wenn es zum Header hinzugefügt wird?

Ihre Hilfe wird sehr geschätzt.

Antwort

3

Wenn Sie set_cookie() aufrufen, setzt es den Cookie auf die Antwort, die er vorbereitet (dh, er setzt den Cookie, wenn die Antwort gesendet wird, nachdem Ihre Funktion zurückkehrt). Der nachfolgende Aufruf an get_cookie() liest aus den Headern der aktuellen Anforderung. Da die aktuelle Anfrage keinen Cookie-Satz enthielt, für den Sie testen, wird dieser nicht eingelesen. Wenn Sie diese Seite jedoch erneut besuchen, sollten Sie ein anderes Ergebnis erhalten, da der Cookie nun Teil der Anfrage ist.

+0

Vielen Dank für Ihre Antwort, aber leider bekomme ich kein anderes Ergebnis beim erneuten Besuch der Seite. Ich bin offen für andere Vorschläge? – Maal

+0

Entschuldigung. Ich habe gerade festgestellt, dass du zu 100% korrekt bist. Vielen Dank. – Maal