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
                  AD

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

                  • Result:50points,
                  • Rating points-4
                  m

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

                  • Result:80points,
                  • Rating points4
                  m

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

                  • Result:20points,
                  • Rating points-10
                  Last comments
                  ИМ
                  Игорь МаксимовNov. 22, 2024, 11:51 a.m.
                  Django - Tutorial 017. Customize the login page to Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                  Evgenii Legotckoi
                  Evgenii LegotckoiOct. 31, 2024, 2:37 p.m.
                  Django - Lesson 064. How to write a Python Markdown extension Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                  A
                  ALO1ZEOct. 19, 2024, 8:19 a.m.
                  Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                  ИМ
                  Игорь МаксимовOct. 5, 2024, 7:51 a.m.
                  Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                  d
                  dblas5July 5, 2024, 11:02 a.m.
                  QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                  Now discuss on the forum
                  Evgenii Legotckoi
                  Evgenii LegotckoiJune 24, 2024, 3:11 p.m.
                  добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                  t
                  tonypeachey1Nov. 15, 2024, 6:04 a.m.
                  google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                  NSProject
                  NSProjectJune 4, 2022, 3:49 a.m.
                  Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                  9
                  9AnonimOct. 25, 2024, 9:10 a.m.
                  Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                  Follow us in social networks