# # Twisted, the Framework of Your Internet # Copyright (C) 2003 Matthew W. Lefkowitz # # This library is free software; you can redistribute it and/or # modify it under the terms of version 2.1 of the GNU Lesser General # Public License as published by the Free Software Foundation. # # This library 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 # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 # USA # from UserDict import UserDict from twisted.python import components from twisted.web import server from twisted.web.resource import Resource class IPathArgs(components.Interface): """Provide a dictionary object which contains arguments which were specified in pathargs format; pathargs format is /foo=bar/ where foo is the key and bar is the value. """ class odict(UserDict): def __init__(self): UserDict.__init__(self) self._keys = [] def __setitem__(self, key, item): UserDict.__setitem__(self, key, item) if not key in self._keys: self._keys.append(key) def keys(self): return self._keys # Use a dict as the IPathArgs implementor for any given request components.registerAdapter(lambda request: odict(), server.Request, IPathArgs) class PathArgs(Resource): """ Provides a mechanism to add 'pathargs' attribute to each request, and to populate it with instances of key=value pairs found in child paths. The value for each key will be an array, optionally split further with a comma. """ def getChildPathArgs(self,path,request): pair = path.split('=') if 2 == len(pair): (key,val) = pair pathargs = IPathArgs(request) pathargs.setdefault(key, []).append(val) return self def getChild(self,path,request): ret = self.getChildPathArgs(path,request) if not ret: ret = Resource.getChild(self,path,request) return ret def test(): from twisted.internet import reactor from twisted.web.server import Site from twisted.web.static import File class DynamicRequest(Resource): def isLeaf(self): return true def render(self, req): pathargs = IPathArgs(req) req.setHeader('Content-type','text/html') resp = """
uri: %s \nargs: %s\npathargs: %s""" return resp % ( req.uri, req.args, pathargs ) root = PathArgs() root.putChild('dynamic', DynamicRequest()) root.putChild('static',File('.')) site = Site(root) reactor.listenTCP(8080,site) reactor.run() if '__main__' == __name__: import sys from twisted.python import log log.startLogging(sys.stdout, 0) test()