在Django模型中保存Facebook图片(REST Social Oath2)

时间:2018-02-18 23:32:12

标签: python django facebook-graph-api django-rest-framework django-oauth

这个问题是关于使用https://github.com/PhilipGarnero/django-rest-framework-social-oauth2库自动保存Django模型中的Facebook个人资料图片。

修改 有两种方法可以解决此问题:在CharField()中保存图像的网址或使用ImageField()保存图像本身。两种解决方案都可以。

上面的库允许我使用承载令牌创建和验证用户。我创建了配置文件模型:

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='userprofile')
    photo = models.FileField(blank=True) # OR
    ######################################
    url = 'facebook.com{user id}/picture/'
    photo = models.CharField(default=url)

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        UserProfile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.userprofile.save()

自动为每个用户创建用户个人资料。现在,我想添加以下代码来保存Facebook的照片。 Facebook API requires user id了解这张照片。

photo = 'https://facebook/{user-id}/picture/'
UserProfile.objects.create(user=instance, photo=photo)

以上不起作用,因为

1)我无法弄清楚从哪里获得user id

2)图像无法像那样存储,我需要将其转换为字节或其他方法。

1 个答案:

答案 0 :(得分:0)

上述答案可能不起作用(它对我不起作用),因为如果没有访问令牌,facebook 个人资料 URL 将不再起作用。以下答案对我有用。

def save_profile(backend, user, response, is_new=False, *args, **kwargs):
    if is_new and backend.name == "facebook":
        # The main part is how to get the profile picture URL and then do what you need to do
        Profile.objects.filter(owner=user).update(
            imageUrl='https://graph.facebook.com/{0}/picture/?type=large&access_token={1}'.format(response['id'],response['access_token']))

在setting.py中添加管道,

SOCIAL_AUTH_PIPELINE+ = ('<full_path>.save_profile')