[Zope-dev] AW: NotFound

Roger Ineichen dev at projekt01.ch
Tue May 13 21:31:39 EDT 2008


Hi Philipp

> Betreff: Re: NotFound
> 
> Roger Ineichen wrote:
> > Is there a reason why zope.publisher.interfaces.NotFound
> > is not locatable?
> > 
> > class NotFound(LookupError, TraversalException):
> >     implements(INotFound)
> > 
> >     def __init__(self, ob, name, request=None):
> >         self.ob = ob
> >         self.name = name
> > 
> > Why should a NotFound error instance not be locatable by 
> default since 
> > it provides a location?
> 
> What kind of a location does it provide?

Nothing, the NotFound object is not locatable.
but I guess it should, because it contains the
real (context) in self.ob.

Since the NotFound object doesn't provide a location
all viewlets or absolute_utl calls in the same layout 
template or metal layout slot used by the NotFound page
run into a location exception.

This makes it impossible to use viewlets as menu items
because the NotFound object messes up the real location.

I solved that problem with providing a custom NotFound page
which uses the self.ob as it's real context:

class NotFoundPagelet(browser.BrowserPagelet, NotFound):
    """NotFound is a view on the real context and not a view on NotFound."""

    def __init__(self, context, request):
        self.context = context.ob
        self.request = request

    def render(self):
        self.request.response.setStatus(404)
        template = zope.component.getMultiAdapter((self, self.request), 
            IPageTemplate)
        return template(self)

This prevents to mess up the menu items becaues it provides 
the context which is responsible for running into a NotFound
object (e.g. self.context = context.ob).

Regards
Roger Ineichen



More information about the Zope-Dev mailing list