【问题标题】:Django-allauth retrieve avatar profile picturesdjango-allauth 检索头像头像
【发布时间】:2015-05-18 21:05:08
【问题描述】:

我使用django-rest-authdjango-allauth 使用用户的 Facebook 个人资料进行用户注册/登录。

现在,我可以从 Facebook 获取一些标准信息(所有身份验证的默认设置)。

是否也可以检索头像图片列表? allAuth中怎么弄?

【问题讨论】:

    标签: django facebook-graph-api django-allauth django-rest-auth


    【解决方案1】:

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

    <img src="{{ user.socialaccount_set.all.0.get_avatar_url }}" />
    

    这就是你想要做的吗?

    【讨论】:

    • 知道如何缓存这些吗?每次页面加载时实时调用它们会很昂贵..
    • @ÖzerS。你能详细说明一下吗?怎么贵?将它们缓存在您自己的服务器上然后只使用 facebooks 服务器交付不是更昂贵吗?
    • @Daggepage 每当有人打开一个使用这个 sn-p 的页面时,您的服务器将联系 Facebook 并获取数据。这通常需要一秒钟左右的时间,因此您的页面在获得数据之前不会呈现(如果不是 ajax)。缓存只存储一次 url 并直接从您的服务器检索它,省去了您需要联系 facebook 的 1 秒延迟。
    • @ÖzerS。这是不正确的。调用 get_avatar_url 只会格式化您可以传递给 img 标记的 URL。它不执行某种 HTTP 请求。它将像任何其他普通图像一样加载图像。
    • 您将如何循环播放这会将头像/个人资料图片显示给其他用户?
    【解决方案2】:

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

    基本上,'allauth => socialaccount'提供user_signed_upuser_logged_in 信号。所以你需要抓住它们并得到 sociallogin 对象的额外数据并填充您的 avatar_url。

    Step-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'
    

    第 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()        
    

    希望这会对你有所帮助。

    【讨论】:

    • 它的显示错误:Signal receivers must accept keyword arguments (**kwargs).函数原型应该是这样的:social_login_fname_lname_profilepic(sociallogin, user, **kwargs):
    【解决方案3】:

    如果您不想使用 Django 信号,可以从 allauth.socialaccount.adapter 扩展 DefaultSocialAccountAdapter 并覆盖 populate_user

    from allauth.socialaccount.adapter import DefaultSocialAccountAdapter
    from allauth.account.utils import user_field
    
    
    class CustomSocialAccountAdapter(DefaultSocialAccountAdapter):
        def populate_user(self, request, sociallogin, data):
            user = super().populate_user(request, sociallogin, data)
            try:
                picture = sociallogin.account.extra_data['picture']
                user_field(user, "profile_photo", picture)
            except (KeyError, AttributeError):
                pass
            return user
    

    请注意,您还应该将DefaultSocialAccountAdapter 更改为settings.py

    SOCIALACCOUNT_ADAPTER = 'some_app.path.to.CustomSocialAccountAdapter'
    

    【讨论】:

      猜你喜欢
      • 2016-12-24
      • 2013-07-11
      • 2018-05-21
      • 2011-08-19
      • 2012-04-26
      • 2018-12-02
      • 1970-01-01
      • 2013-11-13
      • 2013-02-04
      相关资源
      最近更新 更多