2013-01-25 11 views
12

Używam django-allauth dla mojego systemu uwierzytelniania. Potrzebuję tego, gdy użytkownik się zaloguje, moduł profilu zostanie wypełniony informacjami o usługodawcy (w moim przypadku facebook).Jak wypełnić profil użytkownika informacjami o dostawcy django-allauth?

Próbuję użyć sygnału pre_social_login, ale ja po prostu nie wiem jak pobrać dane od dostawcy uwierzytelniania

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

Dzięki !!! Sygnał

Odpowiedz

18

Sygnał pre_social_login jest wysyłany po pomyślnym wykonaniu przez użytkownika uwierzytelnia się za pośrednictwem dostawcy usług społecznościowych, ale przed rzeczywistym przetworzeniem jest przetwarzany . Ten sygnał jest emitowany w celu logowania się przez społeczność, rejestrowania się i dołączania dodatkowych kont społecznościowych do konta za pomocą usługi .

Zostaje wysłana przed zakończeniem rejestracji - dlatego nie jest to właściwy sygnał do użycia.

Zamiast tego polecam użyć allauth.account.signals.user_signed_up, który jest emitowany dla wszystkich użytkowników, lokalnych i społecznościowych.

Z tego programu obsługi można sprawdzić, co jest dołączone do użytkownika, co jest oznaczone jako SocialAccount. Na przykład, jeśli chcesz sprawdzić Google+ konkretne dane, to zrobić:

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

UPDATE: najnowsza wersja rozwojowa sprawia, że ​​to trochę bardziej wygodne, przekazując parametr sociallogin który bezpośrednio zawiera wszystkie powiązane informacje (konto społecznościowe, token, ...)

+0

Musiałem użyć tego w następujący sposób: kwargs.get ("user"). Socialaccount_set.filter (provider = 'facebook'). Extra_data, ale kiedy to zrobię, otrzymuję ten błąd: AttributeError at/accounts/facebook/login/callback/ Obiekt "QuerySet" nie ma atrybutu "extra_data" Dzięki za odpowiedź! Twoja aplikacja jest niesamowita –

+0

Ups, mój przykład był nieprawidłowy (właśnie to poprawiłem). Zapomniałem wybrać element z zestawu zapytań ([0]), jak w: ".filter (...) [0] ..." – pennersr

+0

To działało! Wielkie dzięki! –

0

Robię to w ten sposób i biorąc zdjęcie (pole) adres URL i google provider (pole) jako przykład.

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

upewnić importować: od allauth.socialaccount.models importować SocialAccount

1

Oto konkretny przykład @pennersr rozwiązania:

Assumming model profil ma te 3 pola: 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()   

Jeśli są zdezorientowani o tych picture_url zmiennej każdego dostawcy.Następnie spójrz na 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 A dla rsplit() spojrzeć here

nadzieję, że pomaga. :)

Powiązane problemy