2014-10-08 1 views
2

Поэтому я дам полное раскрытие информации с самого начала, что я совершенно новичок как в Django, так и в Django-allauth.django-allauth Not Saving Социальная информация

Теперь, когда это не работает, проблема, с которой я столкнулась, заключается в том, что когда пользователь входит в систему через социальный сайт (я пытался Google и Facebook), ни одна из данных, полученных с сайта, не является вставляемые в поля данных пользователя. После аутентификации пользователю по-прежнему предлагается ввести электронное письмо, и все поля имени остаются пустыми. Я попытался исправить это вручную, создав пользовательский адаптер, но это тоже не сработало. Из использования операторов печати я вижу, что данные извлекаются с сайта просто отлично - он просто не сохраняется в атрибутах пользователя.

Исправьте меня, если я ошибаюсь, но, прочитав документацию и часть источника django-allauth, у меня создается впечатление, что социальная авторизация автоматически сохраняет электронную почту пользователя и имена и фамилии через крюк populate_user(self, request, sociallogin, data): в классе DefaultSocialAccountAdapter, поэтому мне действительно не нужно иметь дело с обходными решениями. Таким образом, я предполагаю, что я просто делаю что-то глупое, что испортило мне это ... Хотя, если есть умное обходное решение, которое исправит эту проблему, я буду в порядке с этим, из-за отсутствия лучшего решение.

Примечание: Использование Django 1.7 и Python 3.4.1

EDIT: Django-allauth является успех в создании нового пользователя и связать пользователя социальной счет, который содержит все данные, извлекаемых из социальный сайт, но ни одна из этих данных не заполняет поля в объекте User, такие как email, first_name и last_name.

Вот мои настройки конфигурации Джанго-allauth в settings.py:

ACCOUNT_AUTHENTICATION_METHOD = "email" 
ACCOUNT_EMAIL_REQUIRED = True 
ACCOUNT_EMAIL_VERIFICATION = "required" 
ACCOUNT_USERNAME_REQUIRED = False 
SOCIALACCOUNT_AUTO_SIGNUP = True 

# The following line was uncommented when I was trying to use my own adapter 
# SOCIALACCOUNT_ADAPTER = 'profiles.profile_adapter.ProfileAdapter' 

SOCIALACCOUNT_PROVIDERS = { 
    'facebook': 
     { 'SCOPE': ['email'], 
      'AUTH_PARAMS': {'auth_type': 'reauthenticate'}, 
      'METHOD': 'oauth2', 
      'LOCALE_FUNC': lambda request: 'en_US'}, 
    'google': 
     { 'SCOPE': ['https://www.googleapis.com/auth/userinfo.profile'], 
      'AUTH_PARAMS': { 'access_type': 'online' } }, 
} 

А вот код, который я имел в моем пользовательский адаптер (который, используя операторы печати, я мог бы сказать привыкал и обработки правильных данных), где я пытался сохранить вручную поля в объект пользователя

from allauth.socialaccount.adapter import DefaultSocialAccountAdapter 

class ProfileAdapter(DefaultSocialAccountAdapter): 

def pre_social_login(self, request, sociallogin): 
    ''' 
    Check for extra user data and save the desired fields. 
    ''' 
    data = sociallogin.account.extra_data 
    user = sociallogin.account.user 
    print("LOGS: Caught the signal -> Printing extra data of the account: \n" + str(data)) 
    if 'first_name' in data: 
     user.first_name = data['first_name'] 
    elif 'given_name' in data: 
     user.first_name = data['given_name'] 
    if 'last_name' in data: 
     user.last_name = data['last_name'] 
    elif 'family_name' in data: 
     user.last_name = data['family_name'] 
    user.save() 

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

+0

Вы получили социальную часть? Если это так, проверьте таблицу пользователя django auth, у нее должен быть пользователь, созданный django-allauth. Вам не нужно писать для этого адаптер профиля. –

+0

Да, django-allauth создает пользователей, и я вижу, что социальный токен связан с пользователем, но ни одно из полей (I.e. first_name, last_name, email) пользователя не заполнено. – rfj001

ответ

0

Проблема заключалась в том, что когда электронное письмо не было включено в данные, полученные с сайта социальных сетей, django-allauth запросил бы электронное письмо в следующей форме для создания учетной записи. Когда учетная запись будет создана из этой формы, django-allauth не будет использовать данные, полученные из социальных сетей, для заполнения полей. Я думаю, что это проблема с django-allauth.