2015-04-11 7 views

risposta

4

Ecco quello che ho usato per salvare le immagini per 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() 

Salva questa funzione in un file, per esempio, pipelines.py, e quindi aggiungere la funzione al vostro SOCIAL_AUTH_PIPELINE nelle impostazioni.

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

Per Facebook è necessario creare la propria app di Facebook. Puoi solo recuperare informazioni e immagini dagli utenti che ti hanno dato il permesso di farlo. Le stesse regole si applicano più o meno a Google. Leggi i loro documenti API per maggiori dettagli.

+0

Quindi quello che ho capito è che devo trovare un URL sul quale Google+ serve le sue immagini e usarlo per recuperare l'immagine del profilo e poi scavalcare la mia pipeline. Ho capito bene? –

+0

Sì. Leggi i loro documenti per maggiori dettagli. Devi aggiungere le tue funzioni alla pipeline, nel posto giusto per avere il comportamento desiderato. E a chi ha votato: ho dato una buona risposta su come iniziare. Non puoi aspettarti che le persone scrivano l'intero programma per altre persone, ma fornisci risposte che portano l'OP sulla strada giusta, come è avvenuto qui. Questo tipo di negatività è sfortunatamente dilagante qui. – Jaakko

+0

Ho un altro dubbio, ho un modello personalizzato che eredita il modello utente da Django.contrib.author e quindi altri due campi per DOB e immagine del profilo. Quando ho eseguito l'accesso con Google utilizzando OAuth2, il django.contrib.auth.user nel pannello di amministrazione ha ottenuto i suoi valori ma il mio modello personalizzato non è stato collegato su base uno a uno con esso. Qualche consiglio su come potrei essere in grado di farlo? –

9

Per ottenere avatar dal login sociale, è necessario creare un file pipeline.py nella vostra applicazione e aggiungere queste righe a 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 a path of your pipeline.py 
    #and get_avatar is the function. 
) 

e poi aggiungere questo contenuto al file pipeline.py

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

È solo per fb, twitter e google + –

Problemi correlati