这里有一些问题可以回答这个问题,但我的情况有所不同。
不是让allauth创建一个新用户,而是关注电子邮件是否存在并使用
执行登录 user = User.objects.get(email=email)
sociallogin.connect(request, user)
social_account_added.send(
sender=SocialLogin,
request=request,
sociallogin=sociallogin,
)
但是,我不能在这里设置头像,因为我的条件设置方式,这可能永远不会被击中。
替代方案是在我看到的get_redirect_url中,但是如果我使用sociallogin.get_redirect_url就不会调用它,所以似乎有机会跳过它们。
在allauth的user_logged_in = Signal(providing_args=["request", "user"])
app下面有一个信号account
,但如果他们有多个社交网络连接怎么办?我如何确定合适的化身...
答案 0 :(得分:1)
你的问题是:
我将解决这三个问题。
我的方法是收到user_signed_up
信号。我此时也提取用户名(如果可用)。
这是我使用的功能:
@receiver(user_signed_up)
def set_initial_user_names(request, user, sociallogin=None, **kwargs):
"""
When a social account is created successfully and this signal is received,
django-allauth passes in the sociallogin param, giving access to metadata on the remote account, e.g.:
sociallogin.account.provider # e.g. 'twitter'
sociallogin.account.get_avatar_url()
sociallogin.account.get_profile_url()
sociallogin.account.extra_data['screen_name']
See the socialaccount_socialaccount table for more in the 'extra_data' field.
From http://birdhouse.org/blog/2013/12/03/django-allauth-retrieve-firstlast-names-from-fb-twitter-google/comment-page-1/
"""
preferred_avatar_size_pixels = 256
picture_url = "http://www.gravatar.com/avatar/{0}?s={1}".format(
hashlib.md5(user.email.encode('UTF-8')).hexdigest(),
preferred_avatar_size_pixels
)
if sociallogin:
# Extract first / last names from social nets and store on User record
if sociallogin.account.provider == 'twitter':
name = sociallogin.account.extra_data['name']
user.first_name = name.split()[0]
user.last_name = name.split()[1]
if sociallogin.account.provider == 'facebook':
user.first_name = sociallogin.account.extra_data['first_name']
user.last_name = sociallogin.account.extra_data['last_name']
# verified = sociallogin.account.extra_data['verified']
picture_url = "http://graph.facebook.com/{0}/picture?width={1}&height={1}".format(
sociallogin.account.uid, preferred_avatar_size_pixels)
if sociallogin.account.provider == 'google':
user.first_name = sociallogin.account.extra_data['given_name']
user.last_name = sociallogin.account.extra_data['family_name']
# verified = sociallogin.account.extra_data['verified_email']
picture_url = sociallogin.account.extra_data['picture']
profile = UserProfile(user=user, avatar_url=picture_url)
profile.save()
user.guess_display_name()
user.save()
来自Django-allauth starter example I wrote
当用户登录时,该功能被调用。它会抓住用户的名字和头像数据。
我认为这是用户选择的事情。用户无法在同一时刻注册多个社交提供商。 总有一个序列,例如谷歌首先连接Facebook。
因此,我的观点是系统使用来自第一个社交提供者的头像。 allauth UI允许用户添加 其他社交服务提供商一旦设置了最初的服务提供商(尝试上面的deo-allauth-bootrap,你就会看到)。
如果用户添加了其他社交网络,请添加一些用户界面以便在需要时选择该虚拟角色。
这需要一些实验,但总的来说我觉得这不是解决一个真正的问题。
内置的allauth UI允许用户(一旦注册)添加现有的社交提供者。这是对的 这样做的方式,它开箱即用。
如果用户使用另一个社交提供商注册,那么它可能是错误的,或者他们想要两个 单独的帐户。
当然,这需要用户进行一些实验才能看到最直观的体验。
例如,该网站可能会注意到用户之前已经使用Google登录并向Google展示 按钮略有不同或者"再次使用Google"登录,因此用户不会意外注册 不同的社交账户。