[Twisted-web] My solution to appending slashes to resources

Mark Wright markscottwright at gmail.com
Wed Oct 7 11:50:02 EDT 2009


(I didn't reply to my original message because the mailing list never
sent it to me.  Yet, I can see it at the archives here
http://twistedmatrix.com/pipermail/twisted-web/2009-October/004334.html
- is anyone getting these messages?)

A bit of metaprogramming to the rescue.  For those Resource classes
that you want to append slashes automatically, this seems to work.
Can anyone see any problems with this?

def append_slashes(rsc_class):
    original_getChild = rsc_class.getChild
    original_render = rsc_class.render

    def slash_appending_getChild(self, path, request):
        if path == '':
            return self
        else:
            return original_getChild(self, path, request)

    def slash_appending_render(self, request):
        if request.prepath[-1] != '':
            request.redirect(request.childLink(""))
            return ""
        else:
            return original_render(self, request)

    rsc_class.getChild = slash_appending_getChild
    rsc_class.render = slash_appending_render
    rsc_class.isLeaf = False
    return rsc_class


# test code
# entering http://localhost:8080/hello should redirect to
http://localhost:8080/hello/

from twisted.internet import reactor
from twisted.python import log
from twisted.web import server, resource, static
import sys

class MyPage(resource.Resource):
    def render_GET(self, request):
        return "<html><body><p>Hello World</p></body></html>"
append_slashes(MyPage)

log.startLogging(sys.stdout)
root = resource.Resource()
root.putChild("hello", MyPage())
site = server.Site(root)
reactor.listenTCP(8080, site)
reactor.run()



-- 
Mark Wright
markscottwright at gmail.com



More information about the Twisted-web mailing list