2010-04-16 4 views
1

J'utilise Pylons et je veux ajouter un certain middleware pour qu'il attrape 401 codes de statut et rend HTTP Redirect (302) à la page Signin.Un intergiciel WSGI pour effectuer une redirection HTTP sur un code d'état spécifique?

je sais qu'il est intégré dans StatusCodeRedirect Pylônes qui agit de la même façon, mais il ne produit pas de redirection HTTP, et réoriente plutôt interne (ce que je ne veux pas).

Existe-t-il un middleware à ajouter, ou tout middleware générique pouvant être facilement modifié pour effectuer des redirections HTTP sur des codes d'état spécifiques?

Répondre

1

Enfin. J'ai mis en place ma propre classe de middleware qui utilise call_wsgi_application fonction d'aide de 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 

Espérons que cela aidera quelqu'un

1

Cela devrait vous être proche, je ne l'ai pas testé mais c'est basé sur quelque chose que j'ai écrit que j'utilise donc si nécessaire.

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 

edit: oublié de mentionner cette solution nécessite WebOb, mais puisque vous utilisez déjà Pylônes, vous avez cette dépendance.

0

Vous pouvez utiliser une bibliothèque d'autorisation & d'authentification complète pour les pylônes. Les deux plus populaires sont: AuthKit et repoze.who. Ils implémentent déjà ce que vous voulez faire.

Si vous ne souhaitez pas utiliser une bibliothèque existante, vous pouvez écrire un middleware personnalisé. Il s'agit simplement d'un callable Python f(environ, start_response) qui traite les données de requête conservées dans environ. Regardez dans config/environment.py.

Questions connexes