Django-allauth检索头像个人资料图片

Saf*_*ari 9 django facebook-graph-api django-allauth django-rest-auth

我使用django-rest-authdjango-allauth利用用户的Facebook的个人资料有关用户注册/登录.

现在,我可以从Facebook获取一些标准信息(默认为所有auth).

是否可以检索头像图片列表?如何在allAuth中成功?

小智 18

如果你想在django模板中获取头像图片:

<img src="{{ user.socialaccount_set.all.0.get_avatar_url }}" />
Run Code Online (Sandbox Code Playgroud)

这是你想要做的吗?

  • @ÖzerS。这是不正确的。调用`get_avatar_url`只会格式化可传递给`img`标签的URL。它不执行某种HTTP请求。它将像加载其他任何普通图像一样加载该图像。 (2认同)

Jad*_*eda 8

让我快速描述我是如何做到的(使用all_auth和rest_auth).

基本上,'allauth => socialaccount'提供user_signed_upuser_logged_in信号.因此,您需要捕获它们并获取sociallogin对象的额外数据并填充您的avatar_url.

步骤1:创建UserProfile模型:(存储avatar_url)

#models.py
try:
    from django.utils.encoding import force_text
except ImportError:
    from django.utils.encoding import force_unicode as force_text

class UserProfile(models.Model):
    user = models.OneToOneField(User, primary_key=True, verbose_name='user', related_name='profile')
    avatar_url = models.CharField(max_length=256, blank=True, null=True)

    def __str__(self):
        return force_text(self.user.email)

    class Meta():
        db_table = 'user_profile'
Run Code Online (Sandbox Code Playgroud)

步骤2:捕获'user_signed_up'信号并填充'avatar_url'

# signals.py

from allauth.account.signals import user_signed_up, user_logged_in

@receiver(user_signed_up)
def social_login_fname_lname_profilepic(sociallogin, user):
    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':
            f_name = sociallogin.account.extra_data['first_name']
            l_name = sociallogin.account.extra_data['last_name']
            if f_name:
                user.first_name = f_name
            if l_name:
                user.last_name = l_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':
            f_name = sociallogin.account.extra_data['given_name']
            l_name = sociallogin.account.extra_data['family_name']
            if f_name:
                user.first_name = f_name
            if l_name:
                user.last_name = l_name
            #verified = sociallogin.account.extra_data['verified_email']
            picture_url = sociallogin.account.extra_data['picture']

    user.save()
    profile = UserProfile(user=user, avatar_url=picture_url)
    profile.save()        
Run Code Online (Sandbox Code Playgroud)

希望这会帮助你.

  • 它的显示错误:`信号接收者必须接受关键字参数(**kwargs)。` 函数原型应该是这样的:`social_login_fname_lname_profilepic(sociallogin, user, **kwargs):` (2认同)