In PHP world, creating sessions is so easy when using built ins. To customize, secure and make it fast, you have to create a whole new architecture to do that. In my experience with Google AppEngine, your only choice is the latter. I’ve implemented sessions via Cookie and Memcache.
Cookie + Memcache = Session
To create a very straightforward session in my Google AppEngine site, I used the combination of Cookie and memcache. Cookie will hold the session identifier and Memcache will hold the session data. I’ve put that methods on my base handler on a webapp2 based site.
Below is the quick and dirty code.
import os
import webapp2
import logging
import datetime
import dclab
import config
from google.appengine.api import memcache
class WebHandler(webapp2.RequestHandler):
'''Base handler for site'''
def __init__(self, request, response):
self.initialize(request, response)
self.template_params = get_template_params()
self.session_identifier = 'gaesessid'
self.session_id = None
self.init_session()
def init_session(self):
session_id = self.request.cookies.get(self.session_identifier)
if not session_id:
session_id = dclab.generate_uuid()
self.response.headers.add_header('Set-Cookie', '%s=%s; path=/' % (self.session_identifier, session_id))
self.session_id = session_id
def set_session_var(self, name, value):
memkey = '%s-%s' % (self.session_id, name)
memcache.set(memkey, value, 86400)
def get_session_var(self, name):
memkey = '%s-%s' % (self.session_id, name)
return memcache.get(memkey)
... other methods here
init_session() – initializes the session. If the session does not yet exists, it creates a unique ID as the session identifier then store it on a cookie. If session already exists, it will fetch the session identifier from the cookie and store the session ID on the request handler object. The cookie is a session cookie and will expire when the browser is closed.
set_session_var() – sets a value into Memcache. The key is composed of the session ID and the session variable name, therefore it will prevent name collisions between users. It stores the value for 24 hours.
get_session_var() – retrieves value from Memcache. The key is composed of the session ID and the session variable name.
Usage
Usage is very simple. We just call the getter and setter methods like below:
# Set
token = dclab.generate_uuid()
self.set_session_var('token', token)
# Get
session_token = self.get_session_var('token')
Enjoy and share.