在allauth中保存facebook的头像

时间:2017-12-07 03:45:36

标签: django django-models django-forms django-views django-allauth

这里有一些问题可以回答这个问题,但我的情况有所不同。

不是让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,但如果他们有多个社交网络连接怎么办?我如何确定合适的化身...

1 个答案:

答案 0 :(得分:1)

你的问题是:

  • 如何在注册时捕获头像?
  • 如果有多个社交帐户,如何选择哪个头像?
  • 如何挂钩注册,而是将潜在的新用户连接到现有的accout?

我将解决这三个问题。

在注册时捕获头像

我的方法是收到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"登录,因此用户不会意外注册 不同的社交账户。