Question

I'm trying to set it up so that my Pyramid app logs a message whenever it does a redirect - e.g. When one of my views raises HTTPFound.

Creating a custom subclass of HTTPFound worked but it sucks to have to make sure that class is used everywhere in the app.

I then had the idea of creating a custom exception view with context=HTTPFound but that view doesn't seem to get called.

Is there a standard way to set up special handling for a redirect that is global to the app?

Was it helpful?

Solution

To log out redirects you would just have a tween that checks the return status, something like:

from wsgiref.simple_server import make_server

from pyramid.config import Configurator
from pyramid.httpexceptions import HTTPFound


def hello1(request):
    raise HTTPFound(request.route_url('hello2'))


def hello2(request):
    return {'boom': 'shaka'}


def redirect_logger(handler, registry):
    def redirect_handler(request):
        response = handler(request)
        if response.status_int == 302:
            print("OMGZ ITS NOT GOING WHERE YOU THINK")

        return response
    return redirect_handler


def main():
    config = Configurator()

    config.add_route('hello1', '/', view=hello1)
    config.add_route('hello2', '/hi', view=hello2, renderer='json')
    config.add_tween('__main__.redirect_logger')

    app = config.make_wsgi_app()
    return app

if __name__ == '__main__':
    app = main()
    server = make_server('0.0.0.0', 8080, app)
    print("http://0.0.0.0:8080")
    server.serve_forever()
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top