这个问题是关于使用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)图像无法像那样存储,我需要将其转换为字节或其他方法。
答案 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')