如何用django allauth提供程序信息填充用户配置文件?
我正在使用django allauth作为身份验证系统。我需要的是,当用户登录时,profile模块将填充提供商信息(在我的例子中是facebook) 我试图使用pre_social_登录信号,但我不知道如何从提供者auth检索数据如何用django allauth提供程序信息填充用户配置文件?,django,facebook,authentication,django-allauth,Django,Facebook,Authentication,Django Allauth,我正在使用django allauth作为身份验证系统。我需要的是,当用户登录时,profile模块将填充提供商信息(在我的例子中是facebook) 我试图使用pre_social_登录信号,但我不知道如何从提供者auth检索数据 from django.dispatch import receiver from allauth.socialaccount.signals import pre_social_login @receiver(pre_social_login) def pop
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()
来自django.dispatch导入接收方
从allauth.socialaccount.signals导入预社交登录
@接收人(预社交登录)
def填充_配置文件(发送方,**kwargs):
u=UserProfile(>>FACEBOOK\u DATA用户成功登录后发送pre\u social\u login
信号
通过社交提供商进行身份验证,但在实际登录之前
已处理。此信号用于社交登录、注册和
将其他社会帐户连接到帐户
因此,它是在注册完全完成之前发送的——因此这不是合适的信号
相反,我建议您使用allauth.account.signals.user\u signed\u注册
,它为所有用户、本地用户和社交用户发出
在该处理程序中,您可以检查附加到用户的任何SocialAccount
。例如,如果要检查Google+特定数据,请执行以下操作:
user.socialaccount_set.filter(provider='google')[0].extra_data
更新:最新的开发版本通过传递一个直接包含所有相关信息(社交帐户、代币等)的sociallogin
参数,使这一点更加方便。我正在以图片(字段)url和谷歌提供商(字段)为例,这样做
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以下是@solution:的一个具体示例
假设您的配置文件模型有以下3个字段:名字
,电子邮件
,图片url
视图。py:
如果您对每个提供者中的picture\u url
变量感到困惑,请查看文档:
facebook:
picture\u url=”http://graph.facebook.com/“+sociallogin.account.uid+”/picture?type=large“
linkedin:
picture\u url=用户数据['picture-url']['picture-url']
推特:
picture\u url=picture\u url.rsplit(“,”,1)[0]+“+”+picture\u url.rsplit(“,”,1)[1]
,对于rsplit()
请查看
希望有帮助。:有一种更简单的方法
只需将以下内容添加到settings.py。例如,链接在
SOCIALACCOUNT_PROVIDERS = {
'linkedin': {
'SCOPE': [
'r_basicprofile',
'r_emailaddress'
],
'PROFILE_FIELDS': [
'id',
'first-name',
'last-name',
'email-address',
'picture-url',
'public-profile-url',
]
}
字段被自动拉过。我不得不这样使用:kwargs.get('user').socialaccount\u set.filter(provider='facebook').extra\u data。但是当我这样做时,我得到了这个错误:AttributeError at/accounts/facebook/login/callback/'QuerySet'对象没有属性'extra\u data',谢谢你的回答!!你的应用程序太棒了,我的例子错了(我刚刚纠正了它)。我忘了从查询集([0])中选择一项,如:“.filter(…)[0]”可以访问SocialIn参数中的商品,例如SocialIn.account.get_provider_display()、SocialIn.account.get_avatar_url()、SocialIn.account.get_profile_url()、SocialIn.account.provider、SocialIn.account.extra_数据['screen_name']…您如何知道哪些范围
和PROFILE_字段
键值可用?该选项取决于提供商。目前仅适用于LinkedIn
SOCIALACCOUNT_PROVIDERS = {
'linkedin': {
'SCOPE': [
'r_basicprofile',
'r_emailaddress'
],
'PROFILE_FIELDS': [
'id',
'first-name',
'last-name',
'email-address',
'picture-url',
'public-profile-url',
]
}