Как получить социальный аватар Gmail, используя social-auth-app-django - PullRequest
0 голосов
/ 04 июня 2019

Я погуглил и получил полезную ссылку для получения аватара gmail. Я использовал библиотеку social-auth-app-django и следовал инструкциям ссылка для настройки функциональности. Аутентификация работает нормально, но застряла в получении аватара. Я создал pipeline.py внутри основного сконфигурированного корня проекта и назвал это в моем представлении как из TestDjangoAuth.pipeline import get_avatar . Это правильный путь, через который я иду, чтобы получить аватар? Другой вопрос - как использовать метод конвейера в views.py, например user_details , get_username , который мы вызвали в SOCIAL_AUTH_PIPELINE

Это метод перенаправления в views.py, который выдает некоторую ошибку. я хочу установить аватар в качестве сессии:

from TestDjangoAuth.pipeline import get_avatar
def social_login(request):
    if request.method == 'GET':
        if request.user.is_authenticated:
            request.session['photo'] = get_avatar()

Это pipe.py , который я изменил для использования на мой взгляд

def get_avatar(backend, strategy, details, response, user=None, *args, **kwargs):
    url = None
    if backend.name == 'google-oauth2':
        url = response['image'].get('url')

    print(url)
    return url

Когда я возвращаю URL для использования в моем представлении, чтобы использовать изображение профиля, это дает следующую ошибку

AttributeError at /auth/complete/google-oauth2/

'str' object has no attribute 'backend'

1 Ответ

0 голосов
/ 06 июля 2019

Я наконец-то решил свою проблему, используя приведенный ниже фрагмент кода, прибегнув к поиску и применив некоторые изменения.

def get_avatar(request, 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':
        try:
            url = response["picture"]
        except KeyError:
            url = response['image'].get('url')

        get_file = download(url)
        file_name = url.split('/')[-1]
        extension = 'jpeg'

        f = BytesIO(get_file)
        out = BytesIO()

        image = Image.open(f)
        image.save(out, extension)

def download(url):
    try:
        r = requests.get(url)
        if not r.status_code == 200:
            raise Exception('file request failed with status code: ' + str(r.status_code))
        return (r.content)
    except Exception as ex:
        return ('error')
...