progammist
April 24, 2020, 3:41 p.m.

Вывод изображения-аватара пользователя при авторизации VK (Social Auth Django)

social auth, django

И так, появилась задача - выводить аватар пользователя при авторизации через соц. сети. Что в данный момент:

• Настроил авторизацию по гайду Как добавить аутентификацию через социальные сети. ВКонтакте
• Авторизация пользователя проходит успешно
• Добавляем настройку SOCIAL_AUTH_PIPELINE в settings.py
• Добавил функцию (отдельно) которая получает ссылку аватарки при авторизации:

settings.py

  1. SOCIAL_AUTH_PIPELINE = (
  2.  
  3. 'social_core.pipeline.social_auth.social_details',
  4. 'social_core.pipeline.social_auth.social_uid',
  5. 'social_core.pipeline.social_auth.auth_allowed',
  6. 'social_core.pipeline.social_auth.social_user',
  7. 'social_core.pipeline.user.get_username',
  8. 'social_core.pipeline.user.create_user',
  9. 'social_core.pipeline.social_auth.associate_user',
  10. 'social_core.pipeline.social_auth.load_extra_data',
  11. 'social_core.pipeline.user.user_details',
  12. 'blog.pipeline.get_avatar', #Указываем путь, где лежит функция получения аватара.
  13. )

pipeline.py

  1. def get_avatar(backend, response, user=None, *args, **kwargs):
  2.  
  3. url = None
  4.  
  5. if backend.name == 'vk-oauth2':
  6. url = response.get('photo', '')
  7.  
  8. if url:
  9. user.avatar = url
  10. user.save()
  11. print (user.avatar)

В консоле получаем ссылку на изображение пользователя, который проходит авторизацию/аутентификацию:

  1. https://sun9-2.userapi.com/c857628/v857628128/1e4d00/9v4lVL5AESM.jpg

Картинку получили. Собсна в чем пробелмы:

Не могу вывести в шаблон результат этой функции. Модификации User нет, есть только Profile:

models.py

  1. class Profile(models.Model):
  2.  
  3. user = models.OneToOneField(User, on_delete=models.CASCADE)
  4. image = models.ImageField(default='default.jpg', upload_to='profile_pics',)
  5.  
  6. def __str__(self):
  7. return f'{self.user.username} Profile'
  8.  
  9. def save(self, *args, **kwargs):
  10. super(Profile, self).save(*args, **kwargs)

Вопросы:

Как мне расширить модель User, чтобы появилась возможность сохранять полученную ссылку на изображение к текущему пользовтаелю?
Как мне вывести/получать доступ в шаблоне к этой переменной/ссылке на изображение?

Буду благодарен за любую помощь

Do you like it? Share on social networks!

8
progammist
  • April 24, 2020, 3:59 p.m.
  • (edited)

Попробовал в модели Profile добавить поле avatar:

  1. class Profile(models.Model):
  2.  
  3. user = models.OneToOneField(User, on_delete=models.CASCADE)
  4. image = models.ImageField(User,default='default.jpg', upload_to='profile_pics',)
  5. avatar = models.CharField(max_length=100, null=True, blank=True)
  6.  
  7. def __str__(self):
  8. return f'{self.user.username} Profile'

Как мне изменить соответственно функцию?

    Evgenii Legotckoi
    • April 24, 2020, 5:03 p.m.
    • The answer was marked as a solution.

    Пока я ещё не вернулся домой, и не посмотрел переопределение модели User, вопрос в догонку. В каком месте кода вызываете метод get_avatar ?

    А так, раз уж вы в Profile залили avatar поле, то ту функцию я бы переписал так

    1. def get_avatar(backend, response, user=None, *args, **kwargs):
    2.  
    3. url = None
    4.  
    5. if backend.name == 'vk-oauth2':
    6. url = response.get('photo', '')
    7.  
    8. if url:
    9. user.profile.avatar = url
    10. user.profile.save()
    11. print (user.profile.avatar)

    Ну и в шаблоне попробуйте вызывать так

    1. <img src="{{user.profile.avatar}}">
      progammist
      • April 24, 2020, 8:56 p.m.
      • (edited)

      Функция get_avatar указывается в settings.py в настройке SOCIAL_AUTH_PIPELINE () . Насколько я понимаю, таким образом мы указываем пользовательскую обработку в конце обработки аутентификации. Добавил более подробно в описание вопроса.

      Вам большое спасибо за помощь - всё работает!

        Владислав Меленчук
        • April 26, 2020, 2:08 a.m.

        А не подскажите, как реализовать тоже самое только allauth? User переопределена, имеется avatar загрузка.

          Владислав Меленчук
          • May 11, 2020, 12:31 a.m.
          • (edited)

          Снова вернусь в эту тему. В общем как-то раз я сделал всё, что написано выше рабочим на сайте при авторизации юзера через вк.
          Но вот буквально сегодня решил повторить, словил неудачу. Вот в таком виде:

          1. Django Version: 3.0.6
          2. Exception Type: OSError
          3. Exception Value:
          4. [Errno 22] Invalid argument: 'C:\\Project\\OSPanel\\domains\\Django\\media\\https:\\sun9-42.userapi.com\\c855016\\v855016451\\21e884\\pu7jMGrfo38.jpg?ava=1'
          5. Exception Location: C:\Project\OSPanel\domains\Django\venv\lib\site-packages\PIL\Image.py in open, line 2843
          6. Python Executable: C:\Project\OSPanel\domains\Django\venv\Scripts\python.exe
          7.  

          Зачем создается такой путь? Юзер абстрактный, но есть ещё вот такая фича:

          1. # Уменьшаем изображение и размер
          2. def save(self, *args, **kwargs):
          3. super(User, self).save(*args, **kwargs)
          4. # Выбор картинки
          5. img = Image.open(self.avatar.path)
          6. # Условие
          7. if img.height > 300 or img.width > 300:
          8. output_size = (300, 300)
          9. img.thumbnail(output_size)
          10. img.save(self.avatar.path)

          Без неё картинка работает. Но опять же, только через {{ user.avatar }}, а простые (загруженные) авки не работает как надо. Т.е они работают только с {{ user.avatar.url }}

            progammist
            • May 11, 2020, 12:46 a.m.
            • (edited)

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

              А какой условие у вк?

                progammist
                • May 11, 2020, 12:59 a.m.
                • (edited)

                я проверяю не конкретно по соц. сети а по бекенду авторизации.То есть, если авторизация обычная или нет (соц. сети). В моём случае:

                1. {% if user.is_authenticated and not backends.associated %}

                Какая соц.сеть роли не играет, потому что все-равно получаю урл

                  Comments

                  Only authorized users can post comments.
                  Please, Log in or Sign up
                  • Last comments
                  • Evgenii Legotckoi
                    March 9, 2025, 9:02 p.m.
                    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
                  • VP
                    March 9, 2025, 4:14 p.m.
                    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
                  • ИМ
                    Nov. 22, 2024, 9:51 p.m.
                    Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                  • Evgenii Legotckoi
                    Oct. 31, 2024, 11:37 p.m.
                    Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                  • A
                    Oct. 19, 2024, 5:19 p.m.
                    Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html