2013-01-25 65 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

希望有所帮助。 :)

相关问题