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

Changeset 412

Show
Ignore:
Timestamp:
07/05/05 23:08:14
Author:
mikerobi
Message:

Default Filters are now initilized during server startup, this gives init functions access to the config system. config.update has a setDefault flag for setting default values. Partially implimented Remi's proposed changes to the sessionFilter

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/cherrypy/config.py

    r408 r412  
    6363reset() 
    6464 
    65 def update(updateMap=None, file=None): 
     65def update(updateMap=None, file=None, setDefault = False): 
     66    """ Update the configMap from a dictionary or a config file. 
     67        If setDefault is True then the update will not modify 
     68        values already defined in the configMap. 
     69    """ 
    6670    if updateMap: 
    67         for section, valueMap in updateMap.items(): 
     71        for section, valueMap in updateMap.iteritems(): 
    6872            if not isinstance(valueMap, dict): 
    6973                # Shortcut syntax 
     
    7175                valueMap = {section: valueMap} 
    7276                section = 'global' 
    73             s = configMap.get(section
    74             if not s
    75                 configMap[section] = valueMap 
     77            sectionMap = configMap.setdefault(section, {}
     78            if not setDefault
     79                sectionMap.update(valueMap) 
    7680            else: 
    77                 s.update(valueMap) 
     81                for key, value in valueMap.iteritems(): 
     82                    sectionMap.setdefault(key, value) 
    7883    if file: 
    7984        if file not in autoreload.reloadFiles: 
    8085            autoreload.reloadFiles.append(file) 
    81         _load(file
     86        _load(file, setDefault
    8287 
    8388def get(key, defaultValue=None, returnSection=False): 
     
    168173            fp.close() 
    169174 
    170 def _load(configFile = None): 
    171     """ Convert an INI file to a dictionary """ 
     175def _load(configFile = None, setDefault = False): 
     176    """ Convert an INI file to a dictionary.  If set default is True 
     177        Values allready in the configMap will not be changed. 
     178    """ 
    172179     
    173180    # Parse config file 
     
    192199                       (repr(section), repr(option), repr(value))) 
    193200                raise _cperror.WrongConfigValue, msg 
    194             configMap[section][option] = value 
     201            if not setDefault: 
     202                configMap[section][option] = value 
     203            else: 
     204                configMap[section].setdefault(option, value) 
    195205 
    196206def outputConfigMap(): 
  • trunk/cherrypy/lib/filter/sessionfilter/__init__.py

    r410 r412  
    3939        # Create as sessions object for accessing session data 
    4040        cherrypy.sessions = local() 
     41         
     42        self.__configData = local() 
     43        self.__currentSessions = local() 
     44         
    4145        self.sessionManagers = {} 
    42         sessionconfig._loadDefaults() 
    43         #cherrypy.config.update({'global' : sessionconfig._sessionDefaults}) 
     46        cherrypy.config.update(sessionconfig._sessionDefaults, setDefault = True) 
    4447 
    4548 
     
    7073        return storageAdaptor(sessionName, sessionPath)         
    7174         
    72     # this function gets all active sessions based on the path 
    73     def __getSessions(self, names = False): 
    74         """ 
    75         Returns a list containing instances of all active sessions for the current request path. 
    76         """ 
    77         sessions = [] 
    78          
    79         sessionLists = cherrypy.config.getAll('sessionFilter.sessionList') 
    80          
    81         # loop across all paths with session listts 
    82         for sessionPath, sessionList in sessionLists: 
    83              
    84             # if it isn't a list make it one 
    85             if not isinstance(sessionList,list): 
    86                 sessionList=[sessionList] 
    87              
    88             for sessionName in sessionList: 
    89                 # if the session is off skip to the next session in the list 
    90                 if not cherrypy.config.get('sessionFilter.%s.on' % sessionName, True): 
     75    def __loadConfigData(self): 
     76        try: 
     77            path = cherrypy.request.path 
     78        except AttributeError: 
     79            path = "/" 
     80             
     81        configMap = cherrypy.config.configMap 
     82         
     83        self.__configData = {} 
     84        for section, settings in configMap.iteritems(): 
     85            if section == 'global': 
     86                section = '/' 
     87            if path.startswith(section): 
     88                for key, value in settings.iteritems(): 
     89                    if key.startswith('sessionFilter.'): 
     90                        sectionData = self.__configData.setdefault(section, {}) 
     91                        keySplit = key.split('.') 
     92                        if len(keySplit) == 2: 
     93                            defaults = sectionData.setdefault(None, {}) 
     94                            defaults[keySplit[1]] = value 
     95                        elif len(keySplit) == 3: 
     96                            currentSession = sectionData.setdefault(keySplit[1], {}) 
     97                            currentSession[keySplit[2]] = value 
     98         
     99        self.__activeSessions = [] 
     100        for path, sessions in self.__configData.iteritems(): 
     101             
     102            for session, sessionSettings in sessions.iteritems(): 
     103                if session == None: 
     104                    # because i couldn't stand more tabs 
    91105                    continue 
    92                  
    93                 # check that the new sessionName is unique 
    94106                try: 
    95                     sessionManager = self.sessionManagers[sessionName] 
    96                     if sessionManager.path != sessionPath: 
    97                         raise SessionConfigError() 
     107                    sessionManager = self.sessionManagers[session] 
    98108                except KeyError: 
    99                     sessionManager = self.__newSessionManager(sessionName, sessionPath) 
    100                     self.sessionManagers[sessionName] = sessionManager 
    101                  
    102                 sessions.append(sessionManager
    103                  
    104         return sessions 
     109                    sessionManager = self.__newSessionManager(session, path) 
     110                    self.sessionManagers[session] = sessionManager 
     111 
     112                sessionManager.settings = sessionSettings.copy(
     113 
     114                self.__activeSessions.append(sessionManager) 
    105115 
    106116    def __initSessions(self): 
    107117         
    108118        # look up all of the session keys by cookie 
     119        self.__loadConfigData() 
     120         
    109121        sessionKeys = self.getSessionKeys() 
    110          
    111         for sessionManager in self.__getSessions()
     122 
     123        for sessionManager in self.__activeSessions
    112124            sessionKey = sessionKeys.get(sessionManager.name, None) 
    113125             
     
    127139        sessionKeys = {} 
    128140         
    129         for sessionManager in self.__getSessions()
     141        for sessionManager in self.__activeSessions
    130142            sessionName = sessionManager.name 
    131143            cookieName  = sessionManager.cookieName 
     
    157169    def __saveSessions(self): 
    158170         
    159         for sessionManager in self.__getSessions()
     171        for sessionManager in self.__activeSessions
    160172            sessionName = sessionManager.name 
    161173             
     
    170182                cleanUpDelay = sessionconfig.retrieve('cleanUpDelay', sessionManager.name) 
    171183                sessionManager.nextCleanUp=now + cleanUpDelay * 60 
     184 
     185        # this isn't needed but may be helpfull for debugging 
     186#        self.configData = None 
    172187     
    173188    def beforeMain(self): 
  • trunk/cherrypy/lib/filter/sessionfilter/basesession.py

    r400 r412  
    9595        cookiePrefix = sessionconfig.retrieve('cookiePrefix', sessionName, None) 
    9696        self.cookieName = '%s_%s' % (cookiePrefix, sessionName) 
     97 
     98        try: 
     99            from threading import local 
     100        except ImportError: 
     101            from cherrypy._cpthreadinglocal import local 
     102 
     103        # settings dict 
     104        self.settings = local() 
    97105            
    98106     
  • trunk/cherrypy/lib/filter/sessionfilter/sessionconfig.py

    r410 r412  
    4444} 
    4545 
    46 def _loadDefaults(): 
    47     for key, value in _sessionDefaults.iteritems(): 
    48         cherrypy.config.configMap['global'].setdefault(key, value) 
    49  
    5046def retrieve(keyName, sessionName, default = None): 
    5147    missing = object() 
  • trunk/cherrypy/tutorial/tut09_sessionfilter.py

    r396 r412  
    1212        cherrypy.config.update( 
    1313                { 
    14                 'global' : {'sessionFilter.on': True}, 
    15                 '/admin' : {'sessionFilter.sessionList' : ['admin'] }, 
    16                 '/forum' : {'sessionFilter.sessionList' : ['forum']
     14                'global' : { 'sessionFilter.on': True}, 
     15                '/admin' : { 'sessionFilter.admin.on' : True }, 
     16                '/forum' : { 'sessionFilter.forum.on' : True
    1717                }) 
    1818 

Hosted by WebFaction

Log in as guest/cpguest to create tickets