[Twisted-Python] Woven View factories: defered rendering?
Donovan Preston
dp at twistedmatrix.com
Thu Nov 20 08:50:30 MST 2003
On Nov 19, 2003, at 10:20 PM, Michal Pasternak wrote:
> Hi,
>
> I have a webpage, that is rendered via twisted.web.woven.page.Page
> class.
>
> In one of it's wvfactory_ methods, I need to send an e-mail. I would
> also
> like to check if sending of the e-mail was successful (eg. mailserver
> is
> up, running, and reachable via network).
>
> I thought about something like this:
<snip>
Woven has some, ahem, object identity issues. It really, really wants
you to return an actual View instance from a wvfactory_. However, it
does support deferreds being returned from the Widget.generate method.
A deferred callback should mutate the incoming template node in place
in order to cause some changes to the final page:
class MyDeferredWidget(widgets.Widget):
def generate(self, request, node):
theDeferred = doSomeAction()
def theCallback(result):
node.appendChild(
request.d.createTextNode("the result was: %s" % result)
)
theDeferred.addCallback(theCallback)
return theDeferred
class MyPage(page.Page):
template = """<html><span view="theDeferredThing" /></html>"""
def wvfactory_theDeferredThing(self, request, node, model):
return MyDeferredWidget(model)
This is completely untested, but it gives you an idea of what to do.
One of the main reasons for embarking upon nevow was that I knew a lot
more about Deferreds than when I wrote woven, and woven's architecture
made it very difficult to support deferreds properly. In nevow, the
code might look like:
class MyPage(renderer.Renderer):
def render_doSomeAction(self, context, data):
return doSomeAction().addCallback(
lambda result: "The result was: %s" % result)
document = html[
span[
render_doSomeAction
]
]
The point is nevow was designed from the beginning to handle Deferreds
more gracefully than woven was. Also, because the paradigm in nevow
sticks far better to "the return value of a callable replaces whatever
came in" than woven ended up doing, it's impossible to get into funny
identity situations where you're mutating an object but you don't see
the result of it in the final page, because you were mutating a copy
and it was the wrong object.
dp
More information about the Twisted-Python
mailing list