Created
May 24, 2011 07:56
-
-
Save jie/988294 to your computer and use it in GitHub Desktop.
a gae session
This file contains hidden or 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
import os | |
import time | |
import datetime | |
import random | |
import Cookie | |
import logging | |
from google.appengine.api import memcache | |
COOKIE_NAME = 'appengine-session-sid' | |
DEFAULT_COOKIE_PATH = '/' | |
SESSION_EXPIRE_TIME = 7200 | |
class Session(object): | |
def __init__(self): | |
self.sid = None | |
self.key = None | |
self.session = None | |
string_cookie = os.environ.get('HTTP_COOKIE', '') | |
self.cookie = Cookie.SimpleCookie() | |
self.cookie.load(string_cookie) | |
if self.cookie.get(COOKIE_NAME): | |
self.sid = self.cookie[COOKIE_NAME].value | |
self.key = "session-" + self.sid | |
self.session = memcache.get(self.key) | |
if self.session is None: | |
logging.info("Invalidating session "+self.sid) | |
self.sid = None | |
self.key = None | |
if self.session is None: | |
self.sid = str(random.random())[5:]+str(random.random())[5:] | |
self.key = "session-" + self.sid | |
logging.info("Creating session "+self.key); | |
self.session = dict() | |
memcache.add(self.key, self.session, 3600) | |
self.cookie[COOKIE_NAME] = self.sid | |
self.cookie[COOKIE_NAME]['path'] = DEFAULT_COOKIE_PATH | |
print self.cookie | |
def _update_cache(self): | |
memcache.replace(self.key, self.session, 3600) | |
def delete_item(self, keyname): | |
if keyname in self.session: | |
del self.session[keyname] | |
self._update_cache() | |
def get(self, keyname, default=None): | |
if keyname in self.session: | |
return self.session[keyname] | |
return default | |
# session[keyname] = value | |
def __setitem__(self, keyname, value): | |
self.session[keyname] = value | |
self._update_cache() | |
def __getitem__(self, keyname): | |
if keyname in self.session: | |
return self.session[keyname] | |
raise KeyError(str(keyname)) | |
def __delitem__(self, keyname): | |
if keyname in self.session: | |
del self.session[keyname] | |
logging.info(self.session) | |
self._update_cache() | |
return | |
raise KeyError(str(keyname)) | |
def __contains__(self, keyname): | |
try: | |
r = self.__getitem__(keyname) | |
except KeyError: | |
return False | |
return True | |
def __len__(self): | |
return len(self.session) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment