[Twisted-web] HTTP redirection from data_*/render_* methods

en.karpachov at ospaz.ru en.karpachov at ospaz.ru
Fri Jul 15 04:46:22 MDT 2005

I wondered if I can make an HTTP redirection (302) from inside of render_*
or data_* method. Here is a code snipped I wrote; I'd like to know if it
can be considered as "good" nevow practice?

from nevow import rend, loaders, inevow
from twisted.internet import defer

class MyPage(rend.Page):

    addSlash = True

    docFactory = loaders.xmlstr("""\
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en" xmlns:nevow="http://nevow.com/ns/nevow/0.1">
    <div nevow:render="redirect http://google.com">Nothing is here</div>

    buffered = True

    def renderHTTP(self, ctx):
        """The renderHTTP method is overloaded to add errback handler
        to the rendering Deferred object"""

        d = defer.maybeDeferred(rend.Page.renderHTTP, self, ctx)
        d.addErrback(self.onError, ctx)
        return d

    # Custom exception-based class to request redirection
    class __Redirect(Exception): pass

    def onError(self, failure, ctx):
        if isinstance(failure.value, self.__Redirect):
            # If a redirection was requested, then drop the output buffer
            # and redirect the Request object
            return ""
        # Otherwise, fall through
        return failure

    # Convenience method to be called from inside of render_* or data_*
    # callback
    def __redirect(self, url):
        raise self.__Redirect, url

    def render_redirect(self, url):
        return lambda ctx, data: self.__redirect(url)

The "redirect" render directive could be used depending on some another
logic in the page, if some pattern was assigned to the containing tag.

Any comments will be very appreciated.


More information about the Twisted-web mailing list