[Twisted-web] Re: Thoughts on documentation, wading into Twisted, Nevow, etc.

Valentino Volonghi aka Dialtone dialtone at divmod.com
Tue Jul 11 07:07:37 CDT 2006


On Mon, 10 Jul 2006 14:12:38 -0400 (EDT), lloyd at paisite.com wrote:
>Can you post modified code and flesh out your critique? Might be good next
>step, better preparing us for IResources.
>
>What do you think, Valentino?

For IResource the right example is most_basic which uses the following code:

from zope.interface import implements

from nevow import inevow

##
## How does a request come to the Page?
##
## or How to use Nevow without all the fancy automations
##

# This is a simple Root page object, the inevow.IResource interface
# tells us that it must implement 2 methods:
# locateChild and renderHTTP.
# locateChild is used to find children of the current page, it must return a 
# tuple of (page, remaining_segments)
# if there is no page, and you want to display a 404 page, you will need to return
# a None, () tuple.
class Root(object):
    implements(inevow.IResource)

    def locateChild(self, ctx, segments):
        # This locateChild is 'stupid' since it can only work if the tree of
        # pages is static. Anyway it will work for our simple example
        if segments[0] == '':
            # If the server is looking for the root page segments will be ('',)
            # then renderHTTP will be called on self
            return self, ()
        elif segments[0] == 'foo':
            # Now we received a request whose segments had in the first position
            # the string foo
            # like http://example.org/foo/baz/ -> ('foo', 'baz')
            # after the page has been located we return it with the remaining segments
            # ('baz')
            return self.foo, segments[1:]
        else:
            return None, ()
        
    def renderHTTP(self, ctx):
        # When the server needs to return a response to the request it will call
        # the renderHTTP method that will return a string of what needs to be sent.
        return """<html><body>Hello world!<br />
        <a href="./foo" id="foo">foo</a></body></html>
"""

class Foo(object):
    implements(inevow.IResource)
    
    def locateChild(self, ctx, segments):
        # segments is the remaining segments returned by the root locateChild
        # see segments[1:]
        if segments[0] == 'baz':
            return self.baz, segments[1:]
        else:
            return None, ()
    
    def renderHTTP(self, ctx):
        return """<html><body><h1 id="heading">You are in Foo</h1>
        <a href="./foo/baz" id="baz">baz</a></body></html>
"""

class Baz(object):
    implements(inevow.IResource)
    def locateChild(self, ctx, segments):
        return None, ()
    def renderHTTP(self, ctx):
        return '<html><body><h1 id="heading">You are in Baz</h1></body></html>'

# We are adding children to the pages.
# This could also happen inside the class.
root = Root()
root.foo = Foo()
root.foo.baz = Baz()

This example was written with the clear intent to just show the IResource interface separated from Nevow. Keep in mind that this is the IResource interface from Nevow and not the one from twisted.web.



More information about the Twisted-web mailing list