Download Install Tutorial Docs FAQ Tools WikiLicense Team IRC Planet Involvement Shop Book

Changeset 203

Show
Ignore:
Timestamp:
05/22/05 14:38:04
Author:
mikerobi
Message:

implemented file session storage +refactoring

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/ticket-132/cherrypy/_cpdefaults.py

    r201 r203  
    3333 
    3434import time, thread, os, cpg 
    35 import cPickle as pickle 
     35#import cPickle as pickle 
    3636 
    3737def _cpLogMessage(msg, context = '', severity = 0): 
     
    6666from lib.session.ramsession import RamSession  
    6767from lib.session.GenericSqlSession import GenericSqlSession 
     68from lib.session.filesession import FileSession 
    6869_sessionTypes = { 
    6970                  'ram'  : RamSession, 
    70                   'file' : None
     71                  'file' : FileSession
    7172                  'sql'  : GenericSqlSession 
    7273                } 
  • branches/ticket-132/cherrypy/_cphttptools.py

    r201 r203  
    227227            # Still save session data 
    228228            if cpg.getConfig('session', 'storageType') and not cpg.request.isStatic: 
    229                 cpg._sessionData.saveSessionMap() 
     229                cpg.sessionManager.saveSessionMap() 
    230230 
    231231            wfile.write('%s %s\r\n' % (cpg.response.headerMap['protocolVersion'], cpg.response.headerMap['Status'])) 
     
    268268    # Save session data 
    269269    if cpg.getConfig('session', 'storageType') and not cpg.request.isStatic: 
    270         cpg._sessionData.saveSessionMap() 
     270        cpg.sessionManager.saveSessionMap() 
    271271         
    272272 
     
    306306        (cpg._lastSessionCleanUpTime + cpg.getConfig('session', 'cleanUpDelay') * 60) <= now): 
    307307        cpg._lastSessionCleanUpTime = now 
    308         cpg._sessionData.cleanUpOldSessions() 
     308        cpg.sessionManager.cleanUpOldSessions() 
    309309 
    310310    # Save original values (in case they get modified by filters) 
     
    377377     
    378378    # robinson 
    379     # the new session system might need to peek at the object so this code was moved 
    380     # from above 
    381      
    382379    # Get session data 
    383380    if cpg.getConfig('session', 'storageType') and not cpg.request.isStatic: 
    384         cpg._sessionData.loadSessionMap() 
     381        cpg.sessionManager.loadSessionMap() 
    385382 
    386383    # Remove "root" from objectPathList and join it to get objectPath 
  • branches/ticket-132/cherrypy/_cpserver.py

    r201 r203  
    7777    sessionType = cpg.getConfig('session', 'storageType') 
    7878     
    79     cpg._sessionData = _sessionTypes[sessionType]() 
     79    cpg.sessionManager = _sessionTypes[sessionType]() 
    8080 
    8181    try: 
    82         onStartThreadList.append(cpg._sessionData.onStartThread) 
     82        onStartThreadList.append(cpg.sessionManager.onStartThread) 
    8383    except AttributeError: 
    8484        pass 
  • branches/ticket-132/cherrypy/lib/session/basesession.py

    r201 r203  
    7979    def newSession(self): 
    8080        """ Return a new sessionMap instance """ 
     81        # this needs to check the config file for default values 
    8182        return SessionMapClass(dataKeys = { '__sessionKey': self.generateSessionId() }) 
    8283 
     84    def getSessionKey(self): 
     85        """  
     86        Returns the current sessionkey, return None if there is no session. 
     87        Applications should never need to call this function.  It is public 
     88        so it can be redifined (to use url based sessions or other magic) 
     89        """ 
     90         
     91        cpg = cherrypy.cpg 
     92        try: 
     93            return cpg.request.simpleCookie[cpg.getConfig('session', 'cookieName')].value 
     94        except: 
     95            return None 
     96             
     97    def setSessionKey(self, sessionKey): 
     98        """  
     99        Sets the session key in a cookie.  Aplications should not call this function, 
     100        but it might be usefull to redefine it. 
     101        """ 
     102         
     103        cpg = cherrypy.cpg 
     104        cpg.response.simpleCookie[cpg.getConfig('session', 'cookieName')] = sessionKey 
     105        cpg.response.simpleCookie[cpg.getConfig('session', 'cookieName')]['path'] = '/' 
     106        cpg.response.simpleCookie[cpg.getConfig('session', 'cookieName')]['version'] = 1 
     107 
    83108    def loadSessionMap(self, autoCreate = True): 
    84         """ loads the curent session map or create a new one, unless createNew is false (then sessionMap = None) """ 
     109        """ 
     110        The server calls this function on every request to load that session map 
     111        """ 
    85112        cpg = cherrypy.cpg 
    86113         
    87         # First, get sessionKey from cookie 
    88         try: sessionKey = cpg.request.simpleCookie[cpg.getConfig('session', 'cookieName')].value 
    89         except: sessionKey=None 
     114        # First, get sessionKey from wherever it is stored  
     115        sessionKey = self.getSessionKey() 
     116 
    90117        if sessionKey: 
    91118            # Load session data from wherever it was stored 
     
    97124        if not sessionKey or not sessionMap: 
    98125            if autoCreate: 
    99                 sessionMap = cpg._sessionData.newSession() 
     126                sessionMap = self.newSession() 
    100127            else: 
    101128                sessionMap = None 
    102129         
    103         cpg.response.simpleCookie[cpg.getConfig('session', 'cookieName')] = sessionMap['__sessionKey'] 
    104         cpg.response.simpleCookie[cpg.getConfig('session', 'cookieName')]['path'] = '/' 
    105         cpg.response.simpleCookie[cpg.getConfig('session', 'cookieName')]['version'] = 1 
     130        self.setSessionKey(sessionMap['__sessionKey'])  
    106131 
    107132        cpg.request.sessionMap = sessionMap 
    108133 
    109134    def saveSessionMap(self): 
    110        """ saves the sessionMap """ 
     135       """ 
     136       This function saves the current sessionMap, it is automatically called 
     137       by the server for every request.  Applications should not call this function 
     138       """ 
    111139       cpg = cherrypy.cpg 
    112140       self.__setitem__(cpg.request.sessionMap['__sessionKey'], cpg.request.sessionMap) 
  • branches/ticket-132/cherrypy/lib/session/filesession.py

    r183 r203  
    2828 
    2929import time 
    30 from basesession import BaseSession, BaseSessionObject 
     30from basesession import BaseSession 
    3131import cherrypy.cpg 
     32import mrow 
     33import os 
     34import cPickle as pickle 
     35class FileSession(BaseSession): 
     36   
     37    __lock = mrow.RWLock() 
     38     
     39    def sessionReader(sessionFunc): 
     40        """Decorates a function as being a reader of the sessionMap. 
     41     
     42        Acquires a read lock on the sessionMap before calling `sessionFunc`, then 
     43        releases the lock after the call completes. 
     44         
     45        `sessionFunc` will also be called with a named argument, `sessionMap`, as a 
     46        convenience, set to `cpg.request.sessionMap`. 
     47     
     48        """ 
     49        def _inner(self, *args, **kw): 
     50            lock = self.__lock.reader() 
     51            try: 
     52                return sessionFunc(self, *args, **kw) 
     53            finally: 
     54                lock.release() 
     55        return _inner 
     56     
     57     
     58    def sessionWriter(sessionFunc): 
     59        """Same as sessionReader, except obtains an exclusive write lock.""" 
     60        def _inner(self, sessionKey, sessionValue): 
     61            lock = self.__lock.writer() 
     62            try: 
     63                return sessionFunc(self, sessionKey, sessionValue) 
     64            finally: 
     65                lock.release() 
     66        return _inner 
     67     
     68    def newSession(self): 
     69        ns = {}#self.dataKeys.copy() 
     70        ns.update({  
     71                   '__createdAt'  : time.time(), 
     72                   '__timeout'    : cherrypy.cpg.getConfig('session', 'timeout') * 60, 
     73                   '__maxAge'     : None, 
     74                   '__lastAccess' : time.time(), 
     75                   '__sessionKey' : self.generateSessionId() 
     76                  }) 
     77        return ns.copy() 
     78  
     79    def __getitem__(self, sessionKey): 
     80        sessionStorageFileDir = cherrypy.cpg.getConfig('session', 'storageFileDir') 
     81        fname = os.path.join(sessionStorageFileDir, sessionKey) 
     82        if os.path.exists(fname): 
     83            f = open(fname, "rb") 
     84            sessionData = pickle.load(f) 
     85            f.close() 
     86            return sessionData 
     87        else: return None 
     88    __getitem__ = sessionReader(__getitem__) 
     89     
     90    def __setitem__(self, sessionKey, sessionData): 
     91        sessionStorageFileDir = cherrypy.cpg.getConfig('session', 'storageFileDir') 
     92     
     93        fname=os.path.join(sessionStorageFileDir,sessionKey) 
     94        f = open(fname,"wb") 
     95        pickle.dump(sessionData, f) 
     96        f.close() 
     97    __setitem__ = sessionWriter(__setitem__) 
    3298 
    33 class FileSession(BaseSession): 
    34     __data = {} 
    35     class sessionObject(BaseSessionObject): 
    36         def __init__(self): 
    37             self['expirationTime'] = time.time() + cherrypy.cpg.getConfig('session', 'timeout') * 60 
    38              
    39     def data(self): 
    40       return self.__data 
     99    def __delitem__(self, sessionKey): 
     100        sessionStorageFileDir = cherrypy.cpg.getConfig('session', 'storageFileDir') 
     101        lock = self.__lock.writer() 
     102        try: 
     103            del self.__data[sessionKey] 
     104        finally: 
     105            lock.release() 
    41106     
    42     def get(self, sessionId, default = None): 
    43         return self.__data.get(sessionId, default) 
     107    def cleanUpOldSessions(self): 
     108        print 'cleaning' 
     109        sessionStorageFileDir = cherrypy.cpg.getConfig('session', 'storageFileDir') 
     110        sessionFileList = os.listdir(sessionStorageFileDir) 
    44111 
    45     def __getitem__(self, sessionId): 
    46         return self.__data[sessionId] 
     112        for sessionKey in sessionFileList: 
     113            sessionData = self.__getitem__(sessionKey) 
     114            timeout = sessionData['__timeout'] 
     115            maxAge  = sessionData['__maxAge'] 
     116            sessionAge  =  sessionData['__lastAccess'] - sessionData['__createdAt'] 
     117            for key in sessionData: 
     118              print key, sessionData[key] 
     119            if (timeout and timeout < sessionAge) or (maxAge and  maxAge < sessionAge): 
     120                try: 
     121                    os.remove(os.path.join(sessionStorageFileDir, sessionKey)) 
     122                except: 
     123                    print 'exception cleaning' 
     124                    pass 
    47125 
    48     def __setitem__(self, sessionId, value): 
    49         self.__data['expirationTime'] = time.time() + cherrypy.cpg.getConfig('session', 'timeout') * 60 
    50         self.__data[sessionId] = value 
    51  
    52     def cleanUpOldSessions(self): 
    53         now = time.time() 
    54         for key in __data: 
    55             if __data[key]['expirationTime']: 
    56                 del __data[key] 
  • branches/ticket-132/cherrypy/lib/session/ramsession.py

    r201 r203  
    2828 
    2929import time 
    30 from basesession import BaseSession  
     30from basesession import BaseSession 
     31from sessionmap import SessionMapClass  
    3132import cherrypy.cpg 
    3233import mrow 
     
    4546            self.dataKeys = {} 
    4647    __lock = mrow.RWLock() 
     48     
    4749    def sessionReader(sessionFunc): 
    4850        """Decorates a function as being a reader of the sessionMap. 
     
    109111        now = time.time() 
    110112        for sessionKey in __data: 
    111             timeout = self['timeout'] 
    112             maxAge  = self['maxAge'] 
    113             sessionAge  =  self['lastAccess'] -self['createdAt'] 
     113            sessionData = __data[sessionKey] 
     114            timeout = sessionData['__timeout'] 
     115            maxAge  = sessionData['__maxAge'] 
     116            sessionAge  =  sessionData['__lastAccess'] - sessionData['__createdAt'] 
    114117            if (timeout and timeout < sessionAge) or (maxAge and  maxAge < sessionAge): 
    115                 self.__delitem__(sessionKey) 
     118                sessionData.__delitem__(sessionKey) 
    116119 
  • branches/ticket-132/cherrypy/lib/session/sessionmap.py

    r200 r203  
    5555 
    5656    def __init__(self, sessionData = {}): 
    57         self.__sessionData = sessionData 
     57        self.__sessionData = sessionData.copy() 
    5858 
    5959    """ 

Hosted by WebFaction

Log in as guest/cpguest to create tickets