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

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


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, HTTPErrorfrom django.core.files.base import ContentFiledef 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',)


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',)


The above answers may not work (it did not work for me) as the facebook profile URL does not work anymore without accesstoken. The following answer worked for me.

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']))

add to the pipeline in setting.py,

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