Lasciatemi descrivere rapidamente come l'ho fatto (utilizzando all_auth e rest_auth).
Basically, 'allauth => socialaccount' provide user_signed_up and user_logged_in signals. So you need to catch them and get sociallogin object's extra data and populate your avatar_url.
Step-1: Creare un modello ProfiloUtente: (per memorizzare avatar_url)
#models.py
try:
from django.utils.encoding import force_text
except ImportError:
from django.utils.encoding import force_unicode as force_text
class UserProfile(models.Model):
user = models.OneToOneField(User, primary_key=True, verbose_name='user', related_name='profile')
avatar_url = models.CharField(max_length=256, blank=True, null=True)
def __str__(self):
return force_text(self.user.email)
class Meta():
db_table = 'user_profile'
Step-2: Catch 'user_signed_up' del segnale e popolare `avatar_url'
# signals.py
from allauth.account.signals import user_signed_up, user_logged_in
@receiver(user_signed_up)
def social_login_fname_lname_profilepic(sociallogin, user):
preferred_avatar_size_pixels=256
picture_url = "http://www.gravatar.com/avatar/{0}?s={1}".format(
hashlib.md5(user.email.encode('UTF-8')).hexdigest(),
preferred_avatar_size_pixels
)
if sociallogin:
# Extract first/last names from social nets and store on User record
if sociallogin.account.provider == 'twitter':
name = sociallogin.account.extra_data['name']
user.first_name = name.split()[0]
user.last_name = name.split()[1]
if sociallogin.account.provider == 'facebook':
f_name = sociallogin.account.extra_data['first_name']
l_name = sociallogin.account.extra_data['last_name']
if f_name:
user.first_name = f_name
if l_name:
user.last_name = l_name
#verified = sociallogin.account.extra_data['verified']
picture_url = "http://graph.facebook.com/{0}/picture?width={1}&height={1}".format(
sociallogin.account.uid, preferred_avatar_size_pixels)
if sociallogin.account.provider == 'google':
f_name = sociallogin.account.extra_data['given_name']
l_name = sociallogin.account.extra_data['family_name']
if f_name:
user.first_name = f_name
if l_name:
user.last_name = l_name
#verified = sociallogin.account.extra_data['verified_email']
picture_url = sociallogin.account.extra_data['picture']
user.save()
profile = UserProfile(user=user, avatar_url=picture_url)
profile.save()
Speranza questo ti aiuterà.
fonte
2016-11-09 01:10:00
Qualche idea su come nasconderlo? Sarebbe costoso chiamarli in tempo reale ogni volta che una pagina viene caricata .. –
@ ÖzerS. puoi per favore elaborare? Quanto è costoso? Non sarebbe più costoso metterli in cache sul proprio server, quindi avere solo i server di Facebook? – Daggepagge
@Daggepagge ogni volta che qualcuno apre una pagina che utilizza questo frammento di codice, il server contatta Facebook e ottiene i dati. Di solito ci vuole circa un secondo, quindi la tua pagina non verrà visualizzata finché non avrà i dati (se non ajax). Il caching memorizza l'url solo una volta e lo riavvia direttamente dal tuo server, tralasciando il ritardo di 1 secondo che ti servirà per contattare facebook. –