This is incomplete documentation in progress
Getting Started: A basic page
Currently the nevow.rend module contains the Page class which should be subclassed to create new pages. A page is the added as a child of the root page, or it's instantiation can be defined in a childFactory or child_ special method. rend.Page contains the context which is slowly being removed and will soon be replaced by page.Page which should be easily adaptable.
We will construct a page that returns "Hello world!", and propose some structural alternatives.
from nevow import rend, loaders, tags class APage(rend.Page): docFactory = loaders.stan(tags.html[ tags.head[ tags.title["Hello World Example"] ], tags.body[ tags.div(id="hello", _class="helloicator")["Hello World!"] ] ])
This page uses Stan to construct an object-like representation which is flattened into XHTML.
Rendering can also dispatch methods inside the page class known as render specials.
from nevow import rend, loaders, tags class APage(rend.Page): docFactory = loaders.stan(tags.html[ tags.head[ tags.title["Hello World Example"] ], tags.body[ tags.div(render=tags.directive('hi')) ] ]) def render_hi(self, ctx, data): return ctx.tag[ tags.div(id="hello", _class="helloicator")["Hello World"]]
Putting it together
To put it together as a deployable application all we really need is an application servlet.
A compact example of a boiler plate Nevow application could look like this
# Page modules from nevow import rend, loaders, tags # Deployment modules from nevow import appserver from twisted.application import service, internet class APage(rend.Page): addSlash = True docFactory = loaders.stan(tags.html[ tags.head[ tags.title["Hello World Example"] ], tags.body[ tags.div(render=tags.directive('hi')) ] ]) def render_hi(self, ctx, data): return ctx.tag[ tags.div(id="hello", _class="helloicator")["Hello World"]] siteRoot = APage() # Set our page as the site root site = appserver.NevowSite(siteRoot) demo = internet.TCPServer(8080, site) application = service.Application('demo') demo.setServiceParent(application)
It's common to encapsulate the specific service in a deployment function as follows
# Page modules from nevow import rend, loaders, tags # Deployment modules from nevow import appserver from twisted.application import service, internet class APage(rend.Page): addSlash = True docFactory = loaders.stan(tags.html[ tags.head[ tags.title["Hello World Example"] ], tags.body[ tags.div(render=tags.directive('hi')) ] ]) def render_hi(self, ctx, data): return ctx.tag[ tags.div(id="hello", _class="helloicator")["Hello World"]] def deployApp(): siteRoot = APage() # Set our page as the site root site = appserver.NevowSite(siteRoot) return site demo = internet.TCPServer(8080, deployApp()) application = service.Application('demo') demo.setServiceParent(application)
The server can be started by issuing the command twistd -ny simple.py
Note: It is possible to attach multiple sites and protocol servers to a single service parent.
