2013-01-25 13 views
12

Sto usando django-allauth per il mio sistema di autenticazione. Ho bisogno che quando l'utente effettua l'accesso, il modulo del profilo venga popolato con le informazioni del fornitore (nel mio caso Facebook).Come popolare il profilo utente con informazioni sul provider di django-allauth?

sto cercando di usare il segnale pre_social_login, ma io proprio non so come recuperare i dati dal provider di autenticazione

from django.dispatch import receiver 
from allauth.socialaccount.signals import pre_social_login 

@receiver(pre_social_login) 

def populate_profile(sender, **kwargs): 
    u = UserProfile(>>FACEBOOK_DATA<<) 
    u.save() 

Grazie !!!

risposta

18

Il segnale pre_social_login viene inviato dopo che un utente ha effettuato correttamente l'autenticazione tramite un provider social, ma prima che l'accesso sia effettivamente elaborato. Questo segnale viene emesso per accessi social, registrazioni e quando collega account social aggiuntivi a un account.

Quindi viene inviato prima che la registrazione sia completata, quindi questo non è il segnale corretto da usare.

Invece, ti consiglio di utilizzare allauth.account.signals.user_signed_up, che viene emesso per tutti gli utenti, locali e sociali.

Dall'interno di questo gestore è possibile ispezionare qualsiasi cosa SocialAccount sia associata all'utente. Ad esempio, se si vuole ispezionare Google+ dati specifici, fare questo:

user.socialaccount_set.filter(provider='google')[0].extra_data 

UPDATE: l'ultima versione di sviluppo rende questo un po 'più comoda passando lungo un parametro sociallogin che contiene direttamente tutte le informazioni correlate (account sociale, token, ...)

+0

Ho dovuto usarlo in questo modo: kwargs.get ('utente'). Socialaccount_set.filter (provider = 'facebook'). Extra_data ma quando lo faccio, ottengo questo errore: AttributeError in/accounts/facebook/login/callback/ L'oggetto 'QuerySet' non ha attributo 'extra_data' Grazie per l'uomo delle risposte !! La tua app è fantastica –

+0

Oops, il mio esempio era sbagliato (l'ho appena corretto). Ho dimenticato di selezionare un oggetto dal queryset ([0]), come in: ".filter (...) [0] ..." – pennersr

+0

Ha funzionato! Molte grazie! –

0

Sto facendo in questo modo e prendendo immagine (campo) url e provider di Google (campo) come esempio.

socialaccount_obj = SocialAccount.objects.filter(provider='google', user_id=self.user.id) 
    picture = "not available" 
    if len(socialaccount_obj): 
      picture = socialaccount_obj[0].extra_data['picture'] 

assicurarsi di importare: da allauth.socialaccount.models importare SocialAccount

1

Ecco un esempio concreto di @pennersr soluzione:

assume di vostro modello di profilo ha questi 3 campi: first_name , email, picture_url

visualizzazioni.pia:

@receiver(user_signed_up) 
def populate_profile(sociallogin, user, **kwargs):  

    if sociallogin.account.provider == 'facebook': 
     user_data = user.socialaccount_set.filter(provider='facebook')[0].extra_data 
     picture_url = "http://graph.facebook.com/" + sociallogin.account.uid + "/picture?type=large"    
     email = user_data['email'] 
     first_name = user_data['first_name'] 

    if sociallogin.account.provider == 'linkedin': 
     user_data = user.socialaccount_set.filter(provider='linkedin')[0].extra_data   
     picture_url = user_data['picture-urls']['picture-url'] 
     email = user_data['email-address'] 
     first_name = user_data['first-name'] 

    if sociallogin.account.provider == 'twitter': 
     user_data = user.socialaccount_set.filter(provider='twitter')[0].extra_data 
     picture_url = user_data['profile_image_url'] 
     picture_url = picture_url.rsplit("_", 1)[0] + "." + picture_url.rsplit(".", 1)[1] 
     email = user_data['email'] 
     first_name = user_data['name'].split()[0] 

    user.profile.avatar_url = picture_url 
    user.profile.email_address = email 
    user.profile.first_name = first_name 
    user.profile.save()   

Se siete confusi su quelli picture_url variabile in ogni fornitore.Dai un'occhiata ai documenti:

facebook:

picture_url = "http://graph.facebook.com/" + sociallogin.account.uid + "/picture?type=large"Docs

linkedin:

picture_url = user_data['picture-urls']['picture-url']Docs

twitter:

picture_url = picture_url.rsplit("_", 1)[0] + "." + picture_url.rsplit(".", 1)[1]Docs E per la rsplit() un'occhiata here

Speranza che aiuta. :)

Problemi correlati