I'm developing an app on the Google App Engine and have run into a problem. I want to add a cookie to each user session so that I will be able to differentiate amongst the current users. I want them all to be anonymous, thus I do not want a login. Therefor I've implemented following code for cookies.
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))
To test the above code I've used the following code:
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
When I run this the header in the HTML file looks as follows:
None Status: 200 OK Content-Type: text/html; charset=utf-8 Cache-Control: no-cache Set-Cookie: MyCookie=NewValue; expires=Thu, 06 Dec 2012 17:55:41 GMT; Path=/ Content-Length: 1199
"None" in the above refers to the "value1" from the code.
Can you please tell me why the cookie value is "None", even when it is added to the header?
Your help is very much appreciated.
App Engine offers you a choice between two Python language environments.
We use Set-Cookie HTTP header to set cookies. It is optional to set cookies attributes like Expires, Domain, and Path. It is notable that cookies are set before sending magic line "Content-type:text/html\r\n\r\n.
No, It doesn't. Google App Engine (GAE) uses sandboxed Python 2.7 runtime for Python applications. That is the normal App Engine Hosting. However, in GAE you can use Managed VM Hosting.
When you call set_cookie()
, it is setting the cookie on the response it is preparing (that is, it will set the cookie when the response is sent, after your function returns). The subsequent call to get_cookie()
is reading from the headers of the current request. Since the current request did not have a cookie set that you are testing for, it will not be read in. However, if you were to revisit this page, you should get a different result as the cookie will now be part of the request.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With