14👍
To get avatars from social login, you need create a pipeline.py file in your app and add this lines to settings.py:
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',
'apps.users.pipeline.get_avatar', # This is the path of your pipeline.py
#and get_avatar is the function.
)
and later add this content to your pipeline.py file
def get_avatar(backend, strategy, details, response,
user=None, *args, **kwargs):
url = None
if backend.name == 'facebook':
url = "http://graph.facebook.com/%s/picture?type=large"%response['id']
if backend.name == 'twitter':
url = response.get('profile_image_url', '').replace('_normal','')
if backend.name == 'google-oauth2':
url = response['image'].get('url')
ext = url.split('.')[-1]
if url:
user.avatar = url
user.save()
6👍
Here’s what I have used to save pictures for Facebook:
def save_profile_picture(backend, user, response, details,
is_new=False,*args,**kwargs):
if backend.__class__.__name__ == 'FacebookOAuth2':
up = UserProperties.objects.get_or_create(user=user) #RETURNS TUPLE (instance, created(boolean))
if not up[0].photo:
url = 'http://graph.facebook.com/{0}/picture'.format(response['id'])
response = urllib.request.urlopen(url)
io = BytesIO(response.read())
up[0].photo.save('profile_pic_{}.jpg'.format(user.pk), File(io))
up[0].save()
Save this function into a file, for instance, pipelines.py, and then add the function to your SOCIAL_AUTH_PIPELINE in your settings.
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.social_auth.associate_by_email',
'social.pipeline.user.create_user',
'social.pipeline.social_auth.associate_user',
'social.pipeline.social_auth.load_extra_data',
'social.pipeline.user.user_details',
'projects.pipeline.save_profile_picture', #save facebook profile image,
)
For Facebook you need to create your own Facebook app. You can only retrieve information and pictures from users who have given you the permission to do so. Same rules more or less apply for Google. Read their API docs for more detail.
- How to limit queryset/the records to view in Django admin site?
- Twisted(asynch server) vs Django(or any other framework)
- Pycharm + Django 1.3 + STATIC_URL in templates = Unresolved static reference
- Deploying Django to Elastic Beanstalk, migrations failed
4👍
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']))
elif backend.name == 'google-oauth2':
if is_new and response.get('picture'):
Profile.objects.filter(owner=user).update(imageUrl=response['picture'])
add to the pipeline in setting.py,
SOCIAL_AUTH_PIPELINE+ = ('<full_path>.save_profile')
- Django Login POST hangs when i do HttpResponseRedirect (302)
- Getting 415 code with django.test.Client's patch method
- Postgres: values query on json key with django
- Django Template Slice – Reversing Order
- Override Django get_or_create
1👍
Just to extend sadat’s answer which works perfectly for saving the url. If you are wanting to save the actual image from the url to a django imagefield would need to do the below:
import requests
from io import BytesIO
from django.core import files
def save_profile(backend, user, response, is_new=False, *args, **kwargs):
if is_new and backend.name == "facebook":
picture_url='https://graph.facebook.com/{0}/picture/?type=large&access_token={1}'.format(response['id'],
response[
'access_token']))
file_name = f"{uuid.uuid4()}.jpeg"
resp = requests.get(picture_url)
if resp.status_code == requests.codes.ok:
fp = BytesIO()
fp.write(resp.content)
profile.image.save(file_name, files.File(fp))
profile.save()
- How to remove Add button in Django admin, for specific Model?
- Using arbitrary methods or attributes as fields on Django ModelAdmin objects?
- Logging from Django under UWSGI