7

Io uso django-rest-auth e django-allauth sulla registrazione utente/accesso utilizzando il profilo Facebook dell'utente.Django-allauth recupera le immagini del profilo avatar

Ora, posso prendere alcune informazioni standard da Facebook (impostazione predefinita per tutte le autorizzazioni).

È possibile recuperare anche l'elenco delle immagini di avatar? Come si può fare in allAuth?

risposta

14

Se si desidera ottenere avatar immagini in un modello django:

<img src="{{ user.socialaccount_set.all.0.get_avatar_url }}" /> 

E 'questo quello che stavi cercando di fare?

+0

Qualche idea su come nasconderlo? Sarebbe costoso chiamarli in tempo reale ogni volta che una pagina viene caricata .. –

+0

@ Ö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

+0

@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. –

6

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à.

+0

Il suo errore di visualizzazione: 'I ricevitori di segnale devono accettare argomenti di parole chiave (** kwargs) .' Il prototipo di funzione dovrebbe essere come questo:' social_login_fname_lname_profilepic (sociallogin, user, ** kwargs): ' – Ahtisham