Save facebook profile picture in model using python-social-auth

家住魔仙堡 提交于 2019-11-27 13:17:29

问题


How to store the get Facebook profile picture of a user while logging in through Facebook and saving it in my userprofile model.

I found this link which says how to do so using django-social-auth, https://gist.github.com/kalamhavij/1662930. but signals is now deprecated and I have to use pipeline.

Any idea how can I do the same using python-social-auth and pipeline?


回答1:


This is how it worked with me. (from https://github.com/omab/python-social-auth/issues/80)

Add the following code to pipeline.py:

from requests import request, HTTPError

from django.core.files.base import ContentFile


def save_profile_picture(strategy, user, response, details,
                         is_new=False,*args,**kwargs):

    if is_new and strategy.backend.name == 'facebook':
        url = 'http://graph.facebook.com/{0}/picture'.format(response['id'])

        try:
            response = request('GET', url, params={'type': 'large'})
            response.raise_for_status()
        except HTTPError:
            pass
        else:
            profile = user.get_profile()
            profile.profile_photo.save('{0}_social.jpg'.format(user.username),
                                   ContentFile(response.content))
            profile.save()

and add to pipelines in settings.py:

SOCIAL_AUTH_PIPELINE += (
'<application>.pipelines.save_profile_picture',
)



回答2:


Assuming you already configured SOCIAL_AUTH_PIPELINE, there aren't many differences with signals approach.

Just create needed pipeline (skipping all imports, they're obvious)

def update_avatar(backend, details, response, social_user, uid,\
                  user, *args, **kwargs):
    if backend.__class__ == FacebookBackend:
        url = "http://graph.facebook.com/%s/picture?type=large" % response['id']
        avatar = urlopen(url)
        profile = user.get_profile()
        profile.profile_photo.save(slugify(user.username + " social") + '.jpg', 
                            ContentFile(avatar.read()))              
        profile.save()

and add to pipelines:

SOCIAL_AUTH_PIPELINE += (
    '<application>.pipelines.update_avatar',
)


来源:https://stackoverflow.com/questions/19890824/save-facebook-profile-picture-in-model-using-python-social-auth

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!