2015-06-30 11 views
7

Ci sono alcuni URL gestiti dalla mia applicazione Pyramid. Quando un utente non autenticato tenta di aprire qualsiasi URL allora l'utente viene reindirizzato al form di login:Visualizzazioni di login diverse in Pyramid

def forbidden(request): 
    if request.user.keyname == 'guest': 
     return HTTPFound(location=request.route_url('auth.login',)) 

    request.response.status = 403 
    return dict(subtitle=u"Access denied") 

config.add_view(forbidden, context=HTTPForbidden, renderer='auth/forbidden.mako') 

Ma per alcuni URL (percorsi) devo restituire non il modulo di login, ma un 401 Unauthorized status code con WWW-Authenticate intestazione. Come posso impostare i miei percorsi per realizzare questo? Sto indovinando che devo usare route_predicate.

+2

Perché non puoi semplicemente restituire HTTPUnauthorized come descritto [qui] (http://docs.pylonsproject.org/projects/pyramid//en/latest/narr/views.html#http-exceptions) per le poche visualizzazioni che ha bisogno di questa logica? –

risposta

4

È possibile avvolgere questi due errori in uno personalizzato e sollevarlo al posto di entrambi. Quindi puoi gestire la tua eccezione ed eseguire lo scenario desiderato per ogni errore. Ecco un esempio:

class YourError(HTTPException): 
    def __init__(self, error): 
     super(YourError, self).__init__() 

     self.error = error 

    def handle(self, request): 
     if error is HTTPForbidden or is instance(error, HTTPForbidden): 
      return self._handle403(request) 
     elif error is HTTPUnauthorized or is instance(error, HTTPUnauthorized): 
      return self._handle401(request) 

    def _handle403(self, request): 
     # do your stuff for 403 

    def _handle401(self, request): 
     # do your stuff for 401 

# ...modify your view 
def forbidden(context, request): 
    return context.handle(request) 

quindi modificare la configurazione di visualizzazione:

config.add_view(forbidden, context=YourError, renderer='auth/forbidden.mako') 

E poi in altre viste in cui è necessario tornare 403 o 401, andare in questo modo:

def another_view(request) 
    ... 
    raise YourError(HTTPForbidden) 
    # or 
    raise YourError(HTTPUnauthorized) 
    ... 

Quindi dovrai solo implementare la tua logica di gestione all'interno della classe YourError.

1

Mi sono imbattuto in alcuni discussion on the Pyramid issues list che sembra che potrebbe risolvere questo problema.

Detto questo, penso che ciò che potresti essere in grado di fare è sovrascrivere la vista Proibita usando hooks e creare un gestore di eccezioni personalizzato. Poi in là penso che potresti distinguere tra gli errori 403 e 401 e reindirizzare/visualizzare un messaggio di risposta appropriato e personalizzare la risposta in ogni caso.

Problemi correlati