1

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

编辑: 有两种方法可以解决这个问题:将图像的 URLCharField()保存在或使用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 需要 user id获取这张图片。

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

以上不起作用,因为

1)我不知道从哪里得到user id

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

4

2 回答 2

6

有一个非常简单的解决方案。使用python-social-auth 管道

这个东西的工作方式就像middleware,你可以在你的设置页面中添加SOCIAL_AUTH_PIPELINE一个函数,每次用户使用social_django.

一个例子:

在您的设置页面中,添加以下内容:

SOCIAL_AUTH_PIPELINE = (
    'social.pipeline.social_auth.social_details',
    'social.pipeline.social_auth.social_uid',
    'social.pipeline.social_auth.auth_allowed',
    'social.pipeline.social_auth.social_user',
    'social.pipeline.user.get_username',
    'social.pipeline.user.create_user',
    'social.pipeline.social_auth.associate_user',
    'social.pipeline.social_auth.load_extra_data',
    'social.pipeline.user.user_details',
    'home.pipeline.save_profile',
)

home.pipeline.save_profile,这是home.pipeline文件中的一个新管道。(将其更改为您自己的用户模块文件夹)

在那里 ( home.pipeline) 添加以下内容:

from .models import UserProfile

def save_profile(backend, user, response, *args, **kwargs):
    if backend.name == "facebook":
        UserProfile.objects.create(
            user=user, 
            photo_url=response['user']['picture']
        )

这是一个例子。如果用户已经登录,您需要更改它以获取/更新。此外,尝试使用该response参数,您可能可以在那里使用不同的数据。

最后一件事,确保将picture属性添加到设置中:

SOCIAL_AUTH_FACEBOOK_PROFILE_EXTRA_PARAMS = {
  'fields': 'id, name, email, picture'
}

http://python-social-auth.readthedocs.io/en/latest/backends/facebook.html

https://godjango.com/122-custom-python-social-auth-pipeline/

https://github.com/python-social-auth/social-app-django

于 2018-02-27T09:18:49.053 回答
0

上面的答案可能不起作用(它对我不起作用),因为没有 accesstoken,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')
于 2020-12-23T00:47:00.110 回答