progammist
progammistApril 24, 2020, 5:41 a.m.

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

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, чтобы появилась возможность сохранять полученную ссылку на изображение к текущему пользовтаелю?
Как мне вывести/получать доступ в шаблоне к этой переменной/ссылке на изображение?

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

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

8
progammist
  • April 24, 2020, 5:59 a.m.
  • (edited)

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

class Profile(models.Model):

    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(User,default='default.jpg', upload_to='profile_pics',)
    avatar = models.CharField(max_length=100, null=True, blank=True)

    def __str__(self):
        return f'{self.user.username} Profile'

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

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

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

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

    def get_avatar(backend, response, user=None, *args, **kwargs):
    
        url = None
    
        if backend.name == 'vk-oauth2':
            url = response.get('photo', '')
    
        if url:
            user.profile.avatar = url
            user.profile.save()
            print (user.profile.avatar)
    

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

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

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

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

        Владислав Меленчук
        • April 25, 2020, 4:08 p.m.

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

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

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

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

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

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

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

            progammist
            • May 10, 2020, 2:46 p.m.
            • (edited)

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

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

                progammist
                • May 10, 2020, 2:59 p.m.
                • (edited)

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

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

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

                  Comments

                  Only authorized users can post comments.
                  Please, Log in or Sign up
                  d
                  • dsfs
                  • April 26, 2024, 2:56 p.m.

                  C ++ - Test 004. Pointers, Arrays and Loops

                  • Result:80points,
                  • Rating points4
                  d
                  • dsfs
                  • April 26, 2024, 2:45 p.m.

                  C++ - Test 002. Constants

                  • Result:50points,
                  • Rating points-4
                  d
                  • dsfs
                  • April 26, 2024, 2:35 p.m.

                  C++ - Test 001. The first program and data types

                  • Result:73points,
                  • Rating points1
                  Last comments
                  k
                  kmssrFeb. 9, 2024, 5:43 a.m.
                  Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                  Qt WinAPI - Lesson 007. Working with ICMP Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                  EVA
                  EVADec. 25, 2023, 9:30 p.m.
                  Boost - static linking in CMake project under Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
                  J
                  JonnyJoDec. 25, 2023, 7:38 p.m.
                  Boost - static linking in CMake project under Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
                  G
                  GvozdikDec. 19, 2023, 8:01 a.m.
                  Qt/C++ - Lesson 056. Connecting the Boost library in Qt for MinGW and MSVC compilers Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
                  Now discuss on the forum
                  G
                  GarApril 22, 2024, 3:46 p.m.
                  Clipboard Как скопировать окно целиком в clipb?
                  DA
                  Dr Gangil AcademicsApril 20, 2024, 5:45 p.m.
                  Unlock Your Aesthetic Potential: Explore MSC in Facial Aesthetics and Cosmetology in India Embark on a transformative journey with an msc in facial aesthetics and cosmetology in india . Delve into the intricate world of beauty and rejuvenation, guided by expert faculty and …
                  a
                  a_vlasovApril 14, 2024, 4:41 p.m.
                  Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
                  Павел Дорофеев
                  Павел ДорофеевApril 14, 2024, 12:35 p.m.
                  QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
                  f
                  fastrexApril 4, 2024, 2:47 p.m.
                  Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…

                  Follow us in social networks