2013-11-10 2 views
8

Как сохранить изображение пользователя профиля Facebook, во время входа в систему через Facebook и сохранить его в моей модели userprofile.Сохранить изображение профиля facebook в модели с использованием python-social-auth

Я нашел эту ссылку, которая говорит, как это сделать, используя django-social-auth, https://gist.github.com/kalamhavij/1662930. но сигналы теперь устарели, и я должен использовать конвейер.

Любая идея, как я могу сделать то же самое, используя python-social-auth и конвейер?

ответ

19

Это, как он работал со мной. (От https://github.com/omab/python-social-auth/issues/80)

Добавьте следующий код 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() 

и добавить к трубопроводам в settings.py:

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

Это не похоже на работу для меня. параметр пользователя - None. Есть идеи? – gngrwzrd

+0

Одна вещь, о которой никто не упоминает, заключается в том, что вам необходимо правильно настроить конфигурацию конвейера по умолчанию в SOCIAL_AUTH_PIPELINE. Использование + = не работает, и просто настройка конвейера save_profile_picture не работает. Убедитесь, что вы устанавливаете переменные конвейера по умолчанию здесь: http://psa.matiasaguirre.net/docs/pipeline.html – gngrwzrd

+0

для тех, кто хочет увеличить версию изображения, выполните: 'url = 'http://graph.facebook.com /{0}/picture?type=large'.format(response['id ']) ' – romainm

6

Предполагая, что вы уже настроили SOCIAL_AUTH_PIPELINE, существует мало различий в отношении сигналов.

Просто создать необходимый трубопровод (обходя весь импорт, они очевидны)

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() 

и добавить к трубопроводам:

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