Created
October 31, 2010 10:12
-
-
Save mnbi/656392 to your computer and use it in GitHub Desktop.
Short sample to use cookie mechanism to make a session on a GAE app.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# | |
import Cookie | |
import datetime | |
import hashlib | |
import logging | |
import os | |
from google.appengine.api import memcache | |
from google.appengine.ext import db | |
from google.appengine.ext import webapp | |
from google.appengine.ext.webapp import util | |
from google.appengine.ext.webapp import template | |
class SeedInteger(db.Model): | |
value = db.IntegerProperty() | |
SEED_KEY = 'HelloWorld' | |
HW_SESSION_KEY = 'hwsessionid' | |
def get_seed_from_datastore(): | |
seed = db.get(db.Key.from_path('SeedInteger', SEED_KEY)) | |
if not seed: | |
seed = SeedInteger(key_name=SEED_KEY) | |
seed.value = 1 | |
elif seed.value < 9223372036854775807: # 2 ** 63 - 1 | |
# db.IntegerProperty can hold integers with 64 bits. | |
seed.value += 1 | |
else: | |
seed.value = 1 | |
seed.put() | |
return seed.value | |
def generate_session_id(): | |
seed = get_seed_from_datastore() | |
logging.info("Seed for hash: %s" % str(seed)) | |
m = hashlib.sha1() | |
m.update(datetime.datetime.now().isoformat()) | |
m.update(str(seed)) | |
logging.info("SHA1: %s" % m.hexdigest()) | |
return m.hexdigest() | |
class Item(object): | |
def __init__(self, name, value): | |
self.name = name | |
self.value = value | |
class MainHandler(webapp.RequestHandler): | |
def __init__(self): | |
self.session_id = None | |
self.content = [] | |
def get(self): | |
back = (self.request.get('back', default_value='') != '') | |
self.session_id = self.get_session_id() | |
if self.session_id is None or self.session_id == '': | |
self.session_id = generate_session_id() | |
cookie = Cookie.SimpleCookie() | |
cookie[HW_SESSION_KEY] = self.session_id | |
expiration = datetime.datetime.now() + datetime.timedelta(seconds=300) | |
cookie[HW_SESSION_KEY]['expires'] = expiration.strftime('%a, %d-%b-%Y %H:%M:%S GMT') | |
self.response.headers.add_header('Set-Cookie', cookie.output(header='')) | |
data = self.get_data() | |
if not back: | |
data += 1 | |
elif data > 0: | |
data -= 1 | |
self.set_data(data) | |
self.content.append(Item('hash seed', get_seed_from_datastore())) | |
self.content.append(Item('session id', self.session_id)) | |
self.content.append(Item('cookies', self.request.cookies)) | |
self.content.append(Item('data in memcache', '%s' % str(data))) | |
values = { | |
'content': self.content, | |
} | |
path = os.path.join(os.path.dirname(__file__), 'main.html') | |
self.response.out.write(template.render(path, values)) | |
def get_session_id(self): | |
value = None | |
if HW_SESSION_KEY in self.request.cookies: | |
value = self.request.cookies[HW_SESSION_KEY] | |
logging.info("%s: %s" % (HW_SESSION_KEY, type(value))) | |
return value | |
def get_data(self): | |
data = memcache.get(self.session_id) | |
if data is not None: | |
return data | |
else: | |
data = 0 | |
memcache.add(self.session_id, data, 60) | |
return data | |
def set_data(self, data): | |
memcache.set(self.session_id, data, 60) | |
def main(): | |
application = webapp.WSGIApplication([('/', MainHandler)], debug=True) | |
util.run_wsgi_app(application) | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment