gpt4 book ai didi

python - django django-allauth 将社交登录中的 extra_data 保存在信号中

转载 作者:行者123 更新时间:2023-11-30 22:46:58 25 4
gpt4 key购买 nike

设置

我正在使用 Django 1.8.15 和 django-allauth 0.28.0

描述

我想做的事情很容易解释:如果用户通过社交媒体(facebook、google+ 或 twitter)登录,我想从 sociallogin 检索 extra_data 以获取头像的 URL 和其他信息来存储它在我的个人资料中,它是与我的用户模型的一对一关系

我的方法

1)

首先,我添加了一个带有 pre_social_login 的类,例如 here用户通过社交媒体登录后会调用该函数。

models.py

class SocialAdapter(DefaultSocialAccountAdapter):
def pre_social_login(self, request, sociallogin):
"""Get called after a social login. check for data and save what you want."""
user = User.objects.get(id=request.user.id) # Error: user not available
profile = Profile(user=user)
picture = sociallogin.account.extra_data.get('picture', None)
if picture:
# ... code to save picture to profile

settings.py

SOCIALACCOUNT_ADAPTER = 'profile.models.SocialAdapter'

我想从用户那里获取实例,但它似乎尚未创建。所以我尝试了以下方法:

2)

我有另一个信号,如果添加新用户,它会创建一个配置文件:

models.py

@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_profile_for_new_user(sender, created, instance, **kwargs):
"""Signal, that creates a new profile for a new user."""
if created:
profile = Profile(user=instance)
# following code was pasted here
profile.save()

我添加了以下内容:

data = SocialAccount.objects.filter(user=instance)
# do more with data

但是数据它总是空的[]

我很难理解这一点。我的意思是,如果用户通过社交媒体登录,并且我无法从 User 访问该用户(情况 1),因为它尚未创建,那么 SocialAccount 应该具有当我尝试在情况 2 中获取它时被创建?!您还有其他想法来解决这个问题吗?或者我在这里遗漏了什么?

提前致谢

最佳答案

经过几个小时的绝望之后得到了它。

我刚刚使用了另一个信号user_signed_up,而不是来自社交帐户的信号

from allauth.account.signals import user_signed_up

@receiver(user_signed_up)
def retrieve_social_data(request, user, **kwargs):
"""Signal, that gets extra data from sociallogin and put it to profile."""
# get the profile where i want to store the extra_data
profile = Profile(user=user)
# in this signal I can retrieve the obj from SocialAccount
data = SocialAccount.objects.filter(user=user, provider='facebook')
# check if the user has signed up via social media
if data:
picture = data[0].get_avatar_url()
if picture:
# custom def to save the pic in the profile
save_image_from_url(model=profile, url=picture)
profile.save()

http://django-allauth.readthedocs.io/en/latest/signals.html#allauth-account

关于python - django django-allauth 将社交登录中的 extra_data 保存在信号中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40684838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com