7

मैं उपयोगकर्ता की फेसबुक प्रोफ़ाइल का उपयोग कर उपयोगकर्ता पंजीकरण/लॉगिन के बारे में django-rest-auth और django-allauth का उपयोग करता हूं।Django-allauth अवतार प्रोफ़ाइल चित्रों को पुनर्प्राप्त करें

अब, मैं फेसबुक से कुछ मानक जानकारी ले सकता हूं (सभी ऑथ के लिए डिफ़ॉल्ट)।

अवतार-चित्रों की सूची भी पुनर्प्राप्त करना संभव है? इसे सभी में कैसे बना सकते हैं?

उत्तर

14

आप एक Django टेम्पलेट में अवतार चित्रों प्राप्त करना चाहते हैं:

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

कि तुम क्या करने की कोशिश कर रहे थे?

+0

कोई विचार है कि उनको कैश कैसे करें? जब भी पेज लोड होता है तो उन्हें रीयलटाइम में कॉल करना महंगा होगा .. –

+0

@ ÖzerS। क्या आप विस्तार से बता सकते हैं? यह महंगा कैसे है? क्या उन्हें अपने सर्वर पर कैश करने के लिए और अधिक महंगा नहीं होगा, तो बस फेसबुक सर्वर वितरित करें? – Daggepagge

+0

@Daggepagge हर बार जब कोई इस पृष्ठ का उपयोग करता है जो इस स्निपेट का उपयोग करता है, तो आपका सर्वर फेसबुक से संपर्क करेगा और डेटा प्राप्त करेगा। आमतौर पर यह एक सेकंड या तो लेता है, इसलिए आपका पृष्ठ तब तक प्रस्तुत नहीं करेगा जब तक कि डेटा प्राप्त न हो (अगर AJAX नहीं है)। कैशिंग ने केवल यूआरएल को एक बार संग्रहीत किया और सीधे अपने सर्वर से इसे वापस ले लिया, 1 सेकंड देरी छोड़कर आपको फेसबुक से संपर्क करने की आवश्यकता होगी। –

6

मुझे जल्दी से वर्णित करने दें कि मैंने यह कैसे किया (all_auth और 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.

चरण -1: एक UserProfile मॉडल बनाएं: (दुकान 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' 

चरण -2: पकड़ने संकेत 'user_signed_up' और `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()   

आशा पॉप्युलेट यह आपकी मदद करेगा।

+0

इसकी शो त्रुटि: 'सिग्नल रिसीवर को कीवर्ड तर्क (** kwargs) स्वीकार करना होगा।' फ़ंक्शन प्रोटोटाइप इस तरह होना चाहिए: 'social_login_fname_lname_profilepic (sociallogin, user, ** kwargs):' – Ahtisham

संबंधित मुद्दे