2013-01-25 6 views
12

Ich verwende django-allauth für mein Authentifizierungssystem. Ich brauche das, wenn sich der Benutzer anmeldet, wird das Profilmodul mit den Provider-Informationen (in meinem Fall Facebook) gefüllt.Wie wird das Benutzerprofil mit django-allauth Provider-Informationen gefüllt?

Ich versuche, das pre_social_login Signal zu verwenden, aber ich weiß einfach nicht, wie die Daten vom Provider Auth

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() 

Dank abzurufen !!!

Antwort

18

Das Signal pre_social_login wird gesendet, nachdem ein Benutzer erfolgreich authentifiziert über einen sozialen Anbieter, aber bevor die Anmeldung tatsächlich verarbeitet wird. Dieses Signal wird für soziale Logins, Anmeldungen und wenn zusätzliche soziale Konten zu einem Konto verbinden.

So wird es gesendet, bevor die Anmeldung vollständig abgeschlossen ist - daher ist dies nicht das richtige Signal zu verwenden.

Stattdessen empfehle ich Ihnen allauth.account.signals.user_signed_up, die für alle Benutzer, lokale und soziale emittiert wird.

In diesem Handler können Sie überprüfen, was SocialAccount an den Benutzer angeschlossen ist. Zum Beispiel, wenn Sie Google+ spezifische Daten überprüfen wollen, dies tun:

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

UPDATE: die neueste Entwicklung Version macht dies ein wenig bequemer, indem sie entlang einer sociallogin Parameter übergeben, die direkt alle zugehörigen Informationen enthält (Social Account, Token, ...)

+0

Ich musste es so verwenden: kwargs.get ('user') .socialaccount_set.filter (provider = 'facebook'). Extra_data aber wenn ich das tue, erhalte ich diesen Fehler: AttributeError at/accounts/facebook/login/callback/ 'QuerySet' Objekt hat kein Attribut 'extra_data' Danke für die Antwort Mann !! Ihre App ist fantastisch –

+0

Hoppla, mein Beispiel war falsch (ich habe es gerade korrigiert). Ich habe vergessen, ein Element aus dem Queryset ([0]) auszuwählen, wie in: ".filter (...) [0] ..." – pennersr

+0

Das hat funktioniert! Danke vielmals! –

0

Ich mache auf diese Weise und nehmen Bild (Feld) URL und Google Provider (Feld) als ein Beispiel.

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'] 

stellen Sie sicher, importieren: aus allauth.socialaccount.models SocialAccount importieren

1

Hier ist ein konkretes Beispiel für @pennersr Lösung ist:

Assumming Ihr Profil Modell diese drei Felder hat: first_name , email, picture_url

views.py:

@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()   

Wenn Sie über diese picture_url Variable in jedem Provider verwirrt sind.Dann nehmen Sie einen Blick auf die docs:

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 Und für die rsplit() einen Blick here

Hoffnung, das hilft. :)