provide new memcached-based session handler
git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@4101 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
		
							parent
							
								
									1f96d0919a
								
							
						
					
					
						commit
						463b6526b3
					
				
					 3 changed files with 149 additions and 0 deletions
				
			
		
							
								
								
									
										3
									
								
								session/__init__.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								session/__init__.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,3 @@
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					$Id$
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
							
								
								
									
										102
									
								
								session/memcached.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								session/memcached.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,102 @@
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  Copyright (c) 2010 Helmut Merz helmutm@cy55.de
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  This program is free software; you can redistribute it and/or modify
 | 
				
			||||||
 | 
					#  it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					#  the Free Software Foundation; either version 2 of the License, or
 | 
				
			||||||
 | 
					#  (at your option) any later version.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					#  but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 | 
					#  GNU General Public License for more details.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  You should have received a copy of the GNU General Public License
 | 
				
			||||||
 | 
					#  along with this program; if not, write to the Free Software
 | 
				
			||||||
 | 
					#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					Store session data in memcached.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$Id$
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from zope.app.session.interfaces import IClientId, ISession
 | 
				
			||||||
 | 
					from zope.app.session.interfaces import ISessionDataContainer
 | 
				
			||||||
 | 
					from zope.app.session.interfaces import ISessionPkgData, ISessionData
 | 
				
			||||||
 | 
					from zope import component
 | 
				
			||||||
 | 
					from zope.component import getUtility, adapts
 | 
				
			||||||
 | 
					from zope.component.interfaces import ComponentLookupError
 | 
				
			||||||
 | 
					from zope.interface import implements
 | 
				
			||||||
 | 
					from zope.publisher.interfaces import IRequest
 | 
				
			||||||
 | 
					from lovely.memcached.interfaces import IMemcachedClient
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class SessionDataContainer(object):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    implements(ISessionDataContainer)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    lifetime = 8 * 3600
 | 
				
			||||||
 | 
					    namespace = 'cybertools.session'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __getitem__(self, key):
 | 
				
			||||||
 | 
					        client = component.getUtility(IMemcachedClient)
 | 
				
			||||||
 | 
					        return client.query(key, ns=self.namespace)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __setitem__(self, key, value):
 | 
				
			||||||
 | 
					        client = component.getUtility(IMemcachedClient)
 | 
				
			||||||
 | 
					        #print '***', key, value
 | 
				
			||||||
 | 
					        client.set(value, key, lifetime=self.lifetime, ns=self.namespace)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Session(object):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    implements(ISession)
 | 
				
			||||||
 | 
					    adapts(IRequest)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    packageName = 'cybertools.session.memcached'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __init__(self, request):
 | 
				
			||||||
 | 
					        self.client_id = str(IClientId(request))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __getitem__(self, pkg_id):
 | 
				
			||||||
 | 
					        sdc = getUtility(ISessionDataContainer, name=self.packageName)
 | 
				
			||||||
 | 
					        sd = sdc[self.client_id]
 | 
				
			||||||
 | 
					        if sd is None:
 | 
				
			||||||
 | 
					            sd = sdc[self.client_id] = SessionData(self.client_id, sdc)
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            return sd[pkg_id]
 | 
				
			||||||
 | 
					        except KeyError:
 | 
				
			||||||
 | 
					            spd = sd[pkg_id] = SessionPkgData(pkg_id, sd)
 | 
				
			||||||
 | 
					            return spd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class SessionData(dict):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    implements(ISessionData)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __init__(self, id, parent):
 | 
				
			||||||
 | 
					        self.id = id
 | 
				
			||||||
 | 
					        self.parent = parent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __setitem__(self, key, value):
 | 
				
			||||||
 | 
					        super(SessionData, self).__setitem__(key, value)
 | 
				
			||||||
 | 
					        self.parent[self.id] = self
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def setdefault(self, key, default):
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            return self[key]
 | 
				
			||||||
 | 
					        except KeyError:
 | 
				
			||||||
 | 
					            self[key] = default
 | 
				
			||||||
 | 
					            return default
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def clear(self):
 | 
				
			||||||
 | 
					        super(SessionData, self).clear()
 | 
				
			||||||
 | 
					        self.parent[self.id] = self
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class SessionPkgData(SessionData):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    implements(ISessionPkgData)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										44
									
								
								session/memcached.zcml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								session/memcached.zcml
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,44 @@
 | 
				
			||||||
 | 
					<!-- $Id$ -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<configure
 | 
				
			||||||
 | 
					   xmlns="http://namespaces.zope.org/zope"
 | 
				
			||||||
 | 
					   xmlns:browser="http://namespaces.zope.org/browser"
 | 
				
			||||||
 | 
					   i18n_domain="cybertools.session">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <adapter
 | 
				
			||||||
 | 
					      factory="cybertools.session.memcached.Session"
 | 
				
			||||||
 | 
					      provides="zope.app.session.interfaces.ISession"
 | 
				
			||||||
 | 
					      permission="zope.Public" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <!--<adapter
 | 
				
			||||||
 | 
					      factory="cybertools.session.memcached.Session"
 | 
				
			||||||
 | 
					      provides="zope.traversing.interfaces.IPathAdapter"
 | 
				
			||||||
 | 
					      name="session" />-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <utility
 | 
				
			||||||
 | 
					      factory="cybertools.session.memcached.SessionDataContainer"
 | 
				
			||||||
 | 
					      name="cybertools.session.memcached" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <class class="cybertools.session.memcached.Session">
 | 
				
			||||||
 | 
					    <allow interface="zope.app.session.interfaces.ISession" />
 | 
				
			||||||
 | 
					    <implements interface="zope.traversing.interfaces.IPathAdapter" />
 | 
				
			||||||
 | 
					  </class>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <class class="cybertools.session.memcached.SessionDataContainer">
 | 
				
			||||||
 | 
					    <require
 | 
				
			||||||
 | 
					        interface="zope.app.session.interfaces.ISessionDataContainer"
 | 
				
			||||||
 | 
					        permission="zope.Public" />
 | 
				
			||||||
 | 
					    <require
 | 
				
			||||||
 | 
					        set_schema="zope.app.session.interfaces.ISessionDataContainer"
 | 
				
			||||||
 | 
					        permission="zope.ManageServices" />
 | 
				
			||||||
 | 
					  </class>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <class class="cybertools.session.memcached.SessionData">
 | 
				
			||||||
 | 
					    <allow interface="zope.app.session.interfaces.ISessionData" />
 | 
				
			||||||
 | 
					  </class>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <class class="cybertools.session.memcached.SessionPkgData">
 | 
				
			||||||
 | 
					    <allow interface="zope.app.session.interfaces.ISessionPkgData" />
 | 
				
			||||||
 | 
					  </class>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</configure>
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue