[Twisted-web] Patch to nevow for deferrable beforeRender and afterRender

J Turner jamwt-twistedlist at jamwt.com
Tue Dec 28 14:35:36 MST 2004


I'm attaching a patch to the current svn trunk that allows beforeRender
and afterRender to return a Deferred.

It's been tested, and I've scanned it past dp a few times.

 - jamwt
-------------- next part --------------
Index: rend.py
===================================================================
--- rend.py	(revision 992)
+++ rend.py	(working copy)
@@ -23,6 +23,8 @@
 import warnings
 import traceback
 
+from twisted.internet.defer import maybeDeferred
+
 from nevow.context import WovenContext, NodeNotFound, PageContext, RequestContext
 from nevow import compy
 from nevow import inevow
@@ -390,11 +392,12 @@
 
     flattenFactory = flat.flattenFactory
 
-    def renderHTTP(self, ctx):
+    def renderHTTP(self, ctx, doBefore=True):
         ## XXX request is really ctx now, change the name here
         request = inevow.IRequest(ctx)
-        if self.beforeRender is not None:
-            self.beforeRender(ctx)
+        if doBefore and self.beforeRender is not None:
+            return maybeDeferred(self.beforeRender,ctx).addCallback(
+                    lambda result,ctx: self.renderHTTP(ctx,False),ctx)
         if self.addSlash and inevow.ICurrentSegments(ctx)[-1] != '':
             request.redirect(request.URLPath().child(''))
             return ''
@@ -409,20 +412,18 @@
                 del _CARRYOVER[carryover]
             self.context = None
             if self.afterRender is not None:
-                self.afterRender(ctx)
+                return maybeDeferred(self.afterRender,ctx)
 
         if self.buffered:
             io = StringIO()
             writer = io.write
             def finisher(result):
                 request.write(io.getvalue())
-                finishRequest()
-                return result
+                return maybeDeferred(finishRequest).addCallback(lambda r: result)
         else:
             writer = request.write
             def finisher(result):
-                finishRequest()
-                return result
+                return maybeDeferred(finishRequest).addCallback(lambda r: result)
 
         doc = self.docFactory.load()
         ctx =  WovenContext(ctx, tags.invisible[doc])


More information about the Twisted-web mailing list