Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 41 additions & 32 deletions torndsession/session.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,9 @@


class SessionManager(object):

SESSION_ID = 'msid'
DEFAULT_SESSION_LIFETIME = 1200 # seconds

DEFAULT_SESSION_LIFETIME = 1200 # seconds
def __init__(self, handler):
self.handler = handler
self.settings = {}
Expand All @@ -37,8 +36,8 @@ def __init__(self, handler):
self._expires = self._default_session_lifetime
self._is_dirty = True
self.__init_session_driver()
self.__init_session_object() # initialize session object

self.__init_session_object() # initialize session object
def __init_session_object(self):
cookiename = self.settings.get('sid_name', self.SESSION_ID)
session_id = self.handler.get_cookie(cookiename)
Expand Down Expand Up @@ -66,19 +65,19 @@ def __init_session_object(self):
self._expires = expires
self._expires = self._expires if self._expires else self._default_session_lifetime
self._id = session_id

def __init_session_driver(self):
"""
setup session driver.
"""

driver = self.settings.get("driver")
if not driver:
raise SessionConfigurationError('driver not found')
driver_settings = self.settings.get("driver_settings", {})
if not driver_settings:
raise SessionConfigurationError('driver settings not found.')

cache_driver = self.settings.get("cache_driver", True)
if cache_driver:
cache_name = '__cached_session_driver'
Expand All @@ -91,8 +90,8 @@ def __init_session_driver(self):
session_driver = getattr(cache_handler, cache_name)
else:
session_driver = SessionDriverFactory.create_driver(driver, **driver_settings)
self.driver = session_driver(**driver_settings) # create session driver instance.

self.driver = session_driver(**driver_settings) # create session driver instance.
def __init_settings(self):
"""
Init session relative configurations.
Expand Down Expand Up @@ -125,15 +124,15 @@ def __init_settings(self):

"""
session_settings = self.handler.settings.get("session")
if not session_settings: # use default
if not session_settings: # use default
session_settings = {}
session_settings.update(
driver='memory',
driver_settings={'host': self.handler.application},
force_persistence=True,
cache_driver=True)
self.settings = session_settings

def _generate_session_id(self, blength=24):
"""generate session id

Expand All @@ -149,19 +148,27 @@ def _generate_session_id(self, blength=24):
# PY2
return session_id.translate(_smap)
return session_id.decode('utf-8').translate(_smap)

def _get_session_object_from_driver(self, session_id):
"""
Get session data from driver.
"""
return self.driver.get(session_id)

def get(self, key, default=None):
def get(self, key, default=None, raise_except=False):
"""
Return session value with name as key.
"""
return self.session.get(key, default)

if raise_except:
val = default
try:
val = self.session[key]
except:
raise KeyError('%s not found' % key)
return val
else:
return self.session.get(key, default)

def set(self, key, value):
"""
Add/Update session value
Expand All @@ -172,7 +179,7 @@ def set(self, key, value):
if force_update:
self.driver.save(self._id, self.session, self._expires)
self._is_dirty = False

def delete(self, key):
"""
Delete session key-value pair
Expand All @@ -184,37 +191,40 @@ def delete(self, key):
if force_update:
self.driver.save(self._id, self.session, self._expires)
self._is_dirty = False

__delitem__ = delete

def iterkeys(self):
return iter(self.session)

__iter__ = iterkeys

def keys(self):
"""
Return all keys in session object
"""
return self.session.keys()

def flush(self):
"""
this method force system to do session data persistence.
"""
if self._is_dirty:
self.driver.save(self._id, self.session, self._expires)

def __setitem__(self, key, value):
self.set(key, value)

def __getitem__(self, key):
val = self.get(key)
if val:
return val
raise KeyError('%s not found' % key)

return val
# if val:
# return val
# raise KeyError('%s not found' % key)

def __contains__(self, key):
return key in self.session

@property
def id(self):
"""
Expand All @@ -223,7 +233,7 @@ def id(self):
if not hasattr(self, '_id'):
self.__init_session_object()
return self._id

@property
def expires(self):
"""
Expand All @@ -233,7 +243,7 @@ def expires(self):
if not hasattr(self, '_expires'):
self.__init_session_object()
return self._expires

def __session_settings(self):
session_settings = self.settings.get('cookie_config', {})
session_settings.setdefault('expires', None)
Expand All @@ -242,11 +252,10 @@ def __session_settings(self):


class SessionMixin(object):

@property
def session(self):
return self._create_mixin(self, '__session_manager', SessionManager)

def _create_mixin(self, context, inner_property_name, session_handler):
if not hasattr(context, inner_property_name):
setattr(context, inner_property_name, session_handler(context))
Expand Down