2013-01-25 108 views
12

我爲我的身份驗證系統使用django-allauth。我需要當用戶登錄時,配置文件模塊會填充提供者信息(在我的情況下,臉書)。如何使用django-allauth提供程序信息填充用戶配置文件?

我試圖使用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() 

謝謝!

回答

18

pre_social_login信號發送後,用戶成功 認證通過社會提供者,但在登錄之前,實際上是 處理。此信號會發送給社交登錄,註冊以及 將其他社交帳戶連接到帳戶。

所以它在註冊完成前發送 - 因此這不是正確的信號。

相反,我建議您使用allauth.account.signals.user_signed_up,這是爲所有用戶,本地和社會用戶發出的。

從該處理程序中,您可以檢查連接到用戶的任何SocialAccount。例如,如果你想檢查Google+的具體數據,這樣做:

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

UPDATE:最新開發版本讓這更方便一點點沿着直接包含所有相關的信息一sociallogin參數傳遞(社交帳戶,令牌,...)

+0

我不得不這樣用它:kwargs.get('user')。socialaccount_set.filter(provider ='facebook')。extra_data但是當我這樣做時,我得到這個錯誤:AttributeError at/accounts/facebook/login/callback/ 'QuerySet'對象沒有屬性'extra_data'謝謝你的回答!你的應用真棒 –

+0

糟糕,我的例子是錯誤的(我剛糾正它)。我忘了從查詢集([0])中選擇一個項目,如下所示:「.filter(...)[0] ...」 – pennersr

+0

工作正常!非常感謝! –

0

我正在這樣做,並以圖片(字段)網址和谷歌提供商(字段)爲例。

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

1

這裏是@pennersr解決一個具體的例子:

Assumming您的個人資料模型有這3個領域:first_nameemailpicture_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()看看here

希望有所幫助。 :)

相關問題