Domanda

Sto usando piloni e si desidera aggiungere un po 'di middleware ad esso in modo che cattura 401 codici di stato e marche HTTP Redirect (302) per Signin pagina.

So che c'è incorporato StatusCodeRedirect in Piloni che agisce in modo simile, ma non produce reindirizzamento HTTP, e piuttosto redirect internamente (questo è quello che non voglio).

C'è un middleware esistente per aggiungere o qualsiasi middleware generico che può essere facilmente modificato per rendere HTTP redirect su codici di stato specifici?

È stato utile?

Soluzione 2

Infine. Ho implementato mia classe middleware che usi call_wsgi_application funzione di supporto di pylons.util

from pylons.util import call_wsgi_application

class StatusCodeHTTPRedirect(object):

    def __init__(self, wsgi_app, codes, redirect_to):
        self.app = wsgi_app
        # Transform codes to str for comparison
        self.codes = tuple([str(x) for x in codes])
        self.redirect_to = redirect_to

    def __call__(self, environ, start_response):
        status, headers, app_iter, exc_info = call_wsgi_application(self.app,
            environ, catch_exc_info=True)

        if status[:3] in self.codes:
            start_response('302 Found', [('Location', self.redirect_to)])
            return []

        start_response(status, headers, exc_info)
        return app_iter

Spero che questo vi aiuterà qualcuno

Altri suggerimenti

Questo dovrebbe farti abbastanza vicino non ho la prova, però, ma è vagamente basato su qualcosa che ho scritto che sto usando in modo modificare, se necessario.

from webob.dec import wsgify


class Catch401AndRedirect(object):
    """
    responds to 401 redirects to signin page
    """

    def __init__(self, app, signin_url):
        self._app = app
        self._signin_url = signin_url

    @wsgify
    def __call__(self, request):

        response = request.get_response(self._app)

        if response.status_int == 401:
            response.headers["Location"] = self._signin_url
            response.status_int = 302
        else:
            return response

modifica: dimenticato di dire questa soluzione richiede webob, ma dal momento che si sta utilizzando già tralicci, si ha che la dipendenza

.

È possibile utilizzare una libreria completa di autenticazione e l'autorizzazione per Piloni. I due più popolari sono: AuthKit e repoze.who . Hanno già implementano ciò che si vuole fare.

Se non si desidera utilizzare una libreria esistente, è possibile scrivere un middleware personalizzato. E 'semplicemente una f(environ, start_response) richiamabile Python che elabora dati di richiesta conservati in environ. Se vuoi in config/environment.py.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top