Подтвердить что ты не робот

Как заполнить профиль пользователя информацией поставщика django-allauth?

Я использую django-allauth для моей системы аутентификации. Мне нужно, чтобы при входе пользователя модуль профиля заполнился информацией о провайдере (в моем случае facebook).

Я пытаюсь использовать сигнал pre_social_login, но я просто не знаю, как получить данные от поставщика 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()

Спасибо!!!

4b9b3361

Ответ 1

Сигнал pre_social_login отправляется после успешного пользователя аутентифицируется через социального провайдера, но до того, как логин фактически обработанный. Этот сигнал испускается для социального входа, регистрации и когда подключение дополнительных учетных записей к учетной записи.

Поэтому он отправляется до того, как регистрация полностью завершена, поэтому это не правильный сигнал для использования.

Вместо этого я рекомендую использовать allauth.account.signals.user_signed_up, который испускается для всех пользователей, локальных и социальных.

Внутри этого обработчика вы можете проверить, что SocialAccount подключено к пользователю. Например, если вы хотите просмотреть специфические данные Google+, сделайте следующее:

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

UPDATE: последняя версия разработки делает это немного более удобным, передавая по параметру sociallogin, который содержит всю связанную информацию (социальная учетная запись, токен,...)

Ответ 2

Ниже приведен конкретный пример решения @pennersr:

Укомплектование вашей модели профиля имеет следующие 3 поля: 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()         

Если вы запутались в этой переменной picture_url в каждом провайдере. Затем взгляните на документы:

facebook:

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

LinkedIn:

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

твиттер:

picture_url = picture_url.rsplit("_", 1)[0] + "." + picture_url.rsplit(".", 1)[1] Docs И для rsplit() посмотрите здесь

Надеюсь, что это поможет.:)

Ответ 3

Я делаю так и беру изображение (поле) url и google provider (field) в качестве примера.

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

обязательно импортируйте: из allauth.socialaccount.models импортируйте SocialAccount

Ответ 4

Есть более простой способ сделать это.

Просто добавьте следующее в файл settings.py. Например, Linked in...

SOCIALACCOUNT_PROVIDERS = {
'linkedin': {
    'SCOPE': [
        'r_basicprofile',
        'r_emailaddress'
    ],
    'PROFILE_FIELDS': [
        'id',
        'first-name',
        'last-name',
        'email-address',
        'picture-url',
        'public-profile-url',
    ]
}

Поля автоматически вытягиваются.