Qualsiasi WSGI middleware per rendere HTTP redirect sul codice di stato specifico?
-
27-09-2019 - |
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?
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
.