Tom*_*mis 14 authentication django facebook django-allauth
我正在使用django-allauth作为我的身份验证系统.我需要当用户登录时,配置文件模块会填充提供商信息(在我的情况下是facebook).
我正在尝试使用pre_social_login信号,但我只是不知道如何从提供者身份验证中检索数据
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()
Run Code Online (Sandbox Code Playgroud)
谢谢!!!
pen*_*rsr 18
在pre_social_login
之后的用户通过社交提供商认证成功,但实际上之前处理登录发送信号.此信号是为社交登录,注册以及将其他社交帐户连接到帐户时发出的.
因此它在注册完全完成之前发送 - 因此这不是正确的信号.
相反,我建议你使用allauth.account.signals.user_signed_up
,这是为所有用户,本地和社交用户发出的.
在该处理程序中,您可以检查SocialAccount
附加到用户的任何内容.例如,如果您要检查Google+特定数据,请执行以下操作:
user.socialaccount_set.filter(provider='google')[0].extra_data
Run Code Online (Sandbox Code Playgroud)
更新:最新的开发版本通过传递sociallogin
直接包含所有相关信息的参数(社交帐户,令牌,...)使这更方便一点
这是@ pennersr解决方案的具体示例:
Assumming您的个人资料模型有这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()
Run Code Online (Sandbox Code Playgroud)
如果您对picture_url
每个提供程序中的变量感到困惑。然后看一下文档:
脸书:
picture_url = "http://graph.facebook.com/" + sociallogin.account.uid + "/picture?type=large"
文件
linkedin:
picture_url = user_data['picture-urls']['picture-url']
文件
推特:
picture_url = picture_url.rsplit("_", 1)[0] + "." + picture_url.rsplit(".", 1)[1]
Docs并在这里rsplit()
看看
希望能有所帮助。:)
归档时间: |
|
查看次数: |
5151 次 |
最近记录: |