Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cookies using Python and Google App Engine

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.

like image 839
Maal Avatar asked Nov 26 '12 17:11

Maal


People also ask

Is Python used in App Engine?

App Engine offers you a choice between two Python language environments.

How do I set cookies in Python?

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.

Does Google App Engine support Python 3?

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.


1 Answers

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.

like image 62
someone1 Avatar answered Sep 29 '22 08:09

someone1