Skip to content

Instantly share code, notes, and snippets.

@mnbi
Created October 31, 2010 10:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mnbi/656392 to your computer and use it in GitHub Desktop.
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.
#!/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