2015-02-09 13 views
5

Sono un nuovo arrivato nell'universo Python/Django e ho appena iniziato un enorme progetto di cui sono piuttosto entusiasta. Devo far accedere i miei utenti tramite Facebook e la mia app ha un flusso di utenti davvero specifico. Ho impostato django-allauth e tutto funziona come avevo bisogno. Ho annullato LOGIN_REDIRECT_URL in modo che i miei utenti arrivino alla pagina desiderata quando accedono.Cambiare il comportamento di django-allauth render_authentication_error

MA. Quando l'utente apre la finestra di dialogo di login di Facebook e poi la chiude senza effettuare il login, il modello authentication_error.html viene sottoposto a rendering da allauth.socialaccount.helpers.render_authentication_error e questo non è il comportamento che desidero. Voglio che l'utente venga semplicemente reindirizzato alla pagina di accesso.

Sì, so che potrei semplicemente sovrascrivere il modello inserendolo nel mio TEMPLATE_DIRS, ma l'url non sarebbe lo stesso.

Sono giunto alla conclusione. Avevo bisogno di un middleware per intercettare la risposta alla richiesta http.

from django.shortcuts import redirect 

class Middleware(): 
    """ 
    A middleware to override allauth user flow 
    """ 
    def __init__(self): 
     self.url_to_check = "/accounts/facebook/login/token/" 

    def process_response(self, request, response): 
     """ 
     In case of failed faceboook login 
     """ 
     if request.path == self.url_to_check and\ 
       not request.user.is_authenticated(): 
      return redirect('/') 

     return response 

Ma io non sono sicuro circa l'efficienza della mia soluzione, né la pythonesquitude (I Juste si avvicinò con questa parola) di esso. C'è qualcos'altro che potrei fare per cambiare quel comportamento predefinito di django-allauth senza usare un middleware o un segnale?

Grazie!

risposta

0

ho deciso di utilizzare un middleware e reindirizzare a HOME URL nel caso in cui una richiesta GET viene effettuata su un URL della forma ^/accounts/.*$

from django.shortcuts import redirect 
import re 


class AllauthOverrideMiddleware(): 
    """ 
    A middleware to implement a custom user flow 
    """ 
    def __init__(self): 
     # allauth urls 
     self.url_social = re.compile("^/accounts/.*$") 

    def process_request(self, request): 

     # WE CAN ONLY POST TO ALLAUTH URLS 
     if request.method == "GET" and\ 
      self.url_social.match(request.path): 
      return redirect("/") 
0

Sì, so che potrei semplicemente sovrascrivere il modello inserendolo nel mio TEMPLATE_DIRS, ma l'url non sarebbe lo stesso.

Ignorare un modello non modificherà l'URL. Nel modello sovrascritto, puoi fare un client-side redirect a qualsiasi URL che preferisci.

+0

Quello che volevo dire è l'URL non sarebbe lo stesso come la radice url dove voglio reindirizzare l'errore di accesso. Comunque, ho scelto di usare semplicemente un middleware e reindirizzare le richieste GET a/accounts/* per l'url di root –

+0

Cool, felice che tu abbia trovato una soluzione. –