Вывод изображения-аватара пользователя при авторизации VK (Social Auth Django)
И так, появилась задача - выводить аватар пользователя при авторизации через соц. сети. Что в данный момент:
• Настроил авторизацию по гайду
Как добавить аутентификацию через социальные сети. ВКонтакте
• Авторизация пользователя проходит успешно
• Добавляем настройку SOCIAL_AUTH_PIPELINE в
settings.py
• Добавил функцию (отдельно) которая получает ссылку аватарки при авторизации:
settings.py
SOCIAL_AUTH_PIPELINE = ( 'social_core.pipeline.social_auth.social_details', 'social_core.pipeline.social_auth.social_uid', 'social_core.pipeline.social_auth.auth_allowed', 'social_core.pipeline.social_auth.social_user', 'social_core.pipeline.user.get_username', 'social_core.pipeline.user.create_user', 'social_core.pipeline.social_auth.associate_user', 'social_core.pipeline.social_auth.load_extra_data', 'social_core.pipeline.user.user_details', 'blog.pipeline.get_avatar', #Указываем путь, где лежит функция получения аватара. )
pipeline.py
def get_avatar(backend, response, user=None, *args, **kwargs): url = None if backend.name == 'vk-oauth2': url = response.get('photo', '') if url: user.avatar = url user.save() print (user.avatar)
В консоле получаем ссылку на изображение пользователя, который проходит авторизацию/аутентификацию:
https://sun9-2.userapi.com/c857628/v857628128/1e4d00/9v4lVL5AESM.jpg
Картинку получили. Собсна в чем пробелмы:
Не могу вывести в шаблон результат этой функции. Модификации User нет, есть только Profile:
models.py
class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) image = models.ImageField(default='default.jpg', upload_to='profile_pics',) def __str__(self): return f'{self.user.username} Profile' def save(self, *args, **kwargs): super(Profile, self).save(*args, **kwargs)
Вопросы:
Как мне расширить модель User, чтобы появилась возможность сохранять полученную ссылку на изображение к текущему пользовтаелю?
Как мне вывести/получать доступ в шаблоне к этой переменной/ссылке на изображение?
Буду благодарен за любую помощь
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.Вам це подобається? Поділіться в соціальних мережах!
- Akiv Doros
- 11 листопада 2024 р. 14:58
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:50бали,
- Рейтинг балів-4
- molni99
- 26 жовтня 2024 р. 01:37
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:80бали,
- Рейтинг балів4
- molni99
- 26 жовтня 2024 р. 01:29
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:20бали,
- Рейтинг балів-10
Попробовал в модели Profile добавить поле avatar:
Как мне изменить соответственно функцию?
Пока я ещё не вернулся домой, и не посмотрел переопределение модели User, вопрос в догонку. В каком месте кода вызываете метод get_avatar ?
А так, раз уж вы в Profile залили avatar поле, то ту функцию я бы переписал так
Ну и в шаблоне попробуйте вызывать так
Функция get_avatar указывается в settings.py в настройке SOCIAL_AUTH_PIPELINE () . Насколько я понимаю, таким образом мы указываем пользовательскую обработку в конце обработки аутентификации. Добавил более подробно в описание вопроса.
Вам большое спасибо за помощь - всё работает!
А не подскажите, как реализовать тоже самое только allauth? User переопределена, имеется avatar загрузка.
Снова вернусь в эту тему. В общем как-то раз я сделал всё, что написано выше рабочим на сайте при авторизации юзера через вк.
Но вот буквально сегодня решил повторить, словил неудачу. Вот в таком виде:
Зачем создается такой путь? Юзер абстрактный, но есть ещё вот такая фича:
Без неё картинка работает. Но опять же, только через {{ user.avatar }}, а простые (загруженные) авки не работает как надо. Т.е они работают только с {{ user.avatar.url }}
не совсем понял вопрос, но как вариант - я у себя прверяю в шаблоне, если юзер авторизован через соц. сети то выводим урл, если нет - обычное фото
А какой условие у вк?
я проверяю не конкретно по соц. сети а по бекенду авторизации.То есть, если авторизация обычная или нет (соц. сети). В моём случае:
Какая соц.сеть роли не играет, потому что все-равно получаю урл