On Tue, Feb 25, 2003 at 01:20:34PM -0600, Ian Bicking wrote: | > flexible. I say this beacuse I was able to do path variables | > out-of-the-box (2 hours) with this tool; in Webware I've been | > maintaining a patch for over a year, and this patch isn't ideal. | | Can you give a pointer to that? I'm interesting in changing how paths | are parsed in Webware, but I've never felt confident
The Twisted model has the notion of a resource. Let's start with a simple working example: from twisted.web.resource import Resource 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): req.content_type = 'text/plain' return "uri: %s" % req.uri def run(): root = Resource() root.putChild("dynamic", DynamicRequest()) root.putChild("static",File(".")) site = Site(root) reactor.listenTCP(8081,site) reactor.run() The interface of resource is a collection, and has a getChild( pathsegment ) method is called for every segment in the path. So, /foo/bar/baz is somewhat equivalent to the following: site.resource.getChild('foo').getChild('bar').getChild('baz') Twisted accomplishes this magic in a "private" function called getChildForRequest which iterates over each path segment. For the current resource it first checks a mapping to see if any static configured children (putChild) exist, and if a static child isn't found, it calls getChild() to find the next child in order. Of course, the iteration stops when isLeaf() is true. Twisted comes with many built in Resources, including a really nice one for doing redirects (Redirect) and dynamically serving up a file system (File). It also seems to have ones for handling virtual hosts, and sessions. Very cool. For more detail... http://www.twistedmatrix.com/documents/TwistedDocs/current/api/ public/twisted.web.resource.Resource.html On Tue, Feb 25, 2003 at 08:18:25PM +0100, Paul Jongsma wrote: | Last night I was playing with Twisted to get some insight into it, | one of the things which I tried to figure out was how to do | path variables. | | Would you mind sharing your solution with me? The docs on | Twisted are sparse and I haven't been able to figure it out | yet.. Assume that your path is something like... /key:val/another:val/<servlet> At any point in the tree, you should be able to add the following "resource" which will eat all items in the path having a colon. class PathArgs(Resource): def getChild(self,path,request): if not(hasattr(request,'pathargs')): request.pathargs = {} pair = path.split(':') if 2 == len(pair): request.pathargs[pair[0]] = pair[1] return self return Resource.getChild(self,path,request) To try it out, replace "root = Resource()" with "root = PathArgs()" in the code above. Note, you should be able to use this resource anywhere in the tree... I'm completely astonished with the power/simplicity of this mechanism. Serious Kudos to the brain who discovered it... that such a small amount of code can add a "pathargs" attribute to each request in a way that is completely pluggable is just spectacular! Clark ------------------------------------------------------- This SF.net email is sponsored by: Scholarships for Techies! Can't afford IT training? All 2003 ictp students receive scholarships. Get hands-on training in Microsoft, Cisco, Sun, Linux/UNIX, and more. www.ictp.com/training/sourceforge.asp _______________________________________________ Webware-discuss mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/webware-discuss