Search code examples
pyramid

Not found view doesn't work on Pyramid using traversal


I'm using Pyramid (1.5.7) + traversal and following the documentation I've tried all possible ways to get the "Not found exception view" working.

from pyramid.view import notfound_view_config,forbidden_view_config, view_config


@notfound_view_config(renderer="error/not_found.jinja2")
def not_found_view(request):
    request.response.status = 404
    return {}

@forbidden_view_config(renderer="error/forbidden.jinja2")
def forbidden_view(request):
    return {}

Using contexts:

from pyramid.view import view_config
from pyramid.httpexceptions import HTTPForbidden, HTTPUnauthorized


@view_config(context=HTTPNotFound, renderer="error/not_found.jinja2")
def not_found_view(request):
    request.response.status = 404
    return {}

@view_config(context=HTTPForbidden, renderer="error/forbidden.jinja2")
def forbidden_view(request):
    return {}

I'm using the Scan mode, but I've tried also adding a custom function to the configuration:

def main(globals, **settings):
    config = Configurator()
    config.add_notfound_view(notfound)

Not luck either, all time getting the following unhandled exception:

raise HTTPNotFound(msg)
pyramid.httpexceptions.HTTPNotFound: /example-url

Solution

  • Ouch... My bad! I was using a tween which was preventing Pyramid to load the Exceptions:

    def predispatch_factory(handler, registry):
        # one-time configuration code goes here
    
        def predispatch(request):
            # code to be executed for each request before
            # the actual application code goes here
    
            response = handler(request)
    
            # code to be executed for each request after
            # the actual application code goes here
    
            return response
    
        return predispatch
    

    Still I don't know why but after removing this tween all seems to work as expected.