По рекомендации пользователей сайта начал добавлять авторизацию через социальные сети на сайт. Первой такой социальной сетью стала ВКонтакте, как наиболее популярная социальная сеть у пользователей моего сайта. Django сам по себе имеет необходимый функционал по работе с протоколом OAuth 2.0, который мог используется в API ВКонтакте для авторизации пользователей на сторонних ресурсах (и не только для авторизации). Но в данном случае я не стал писать свой велосипед, используя голую поддержку OAuth в Django, а нашёл очень хорошую батарейку, которая пожалуй достаточно известна среди разработчиков сайтов на Django, которая позволила внедрить авторизацию через ВКонтакте всего за пару часов. Эта батарейка называется Python Social Auth Django . Давайте пошагово разберёмся, что нам нужно сделать, чтобы подключить авторизацию через ВКонтакте на сайт с Django
Шаг 1 — Установка Python Social Auth Django
Делается это одной командой в вашем виртуальном окружении через утилиту pip
VK Tech | Lessons — «Бэкенд», Алексей Акулович
pip install social-auth-app-django
В документации предлагается при конфигурировании два вариант ORM для работы системы аутентификации через социальные сети. Это классическая ОРМ Django и ОРМ MongoEngine, но так получилось, что требуемый для MongoEngine пакет устарел и немного несовместим с последними версиями Django, просто не работает, даже в документации разработчиков mongoengine висит призыв о помощи с поддержкой утилиты. Поэтому будем настраивать только для классической ОРМ.
Шаг 2 — Регистрация батарейки на вашем сайте
Прописываем приложение аутентификации в INSTALLED_APPS
INSTALLED_APPS = ( . ‘social_django’, . )
Шаг 3 — Миграция базы данных
Вам потребуется применить изменения в структуре базы данных, поскольку данная батарейка имеет свои таблицы для работы с авторизацией пользователей.
./manage.py migrate
Далее последуем ещё одной рекомендации по настройке базы данных, если Вы, как и я, используете PostgreSQL. А именно. При использовании PostgreSQL рекомендуется использовать встроенное поле JSONB для хранения извлеченных дополнительных_данных. Чтобы включить его, задайте настройку:
SOCIAL_AUTH_POSTGRES_JSONFIELD = True
Шаг 4 — Настройка бекендов аутентификации
Также прописываем в settings.py
AUTHENTICATION_BACKENDS = ( ‘social_core.backends.vk.VKOAuth2’, # бекенд авторизации через ВКонтакте ‘django.contrib.auth.backends.ModelBackend’, # бекенд классической аутентификации, чтобы работала авторизация через обычный логин и пароль )
Обязательно включите бекенд классической аутентификации, иначе потеряете возможность зайти через логин и пароль на сайт.
Шаг 5 — Настройка процессора шаблонов
У меня за полтора года разработки данного сайта настройка TEMPLATES осталась практически нетронутой, но я добавил одну строку для этой батарейки
TEMPLATES = [ < ‘BACKEND’: ‘django.template.backends.django.DjangoTemplates’, ‘DIRS’: [], ‘APP_DIRS’: True, ‘OPTIONS’: < ‘context_processors’: [ ‘django.template.context_processors.debug’, ‘django.template.context_processors.request’, ‘django.contrib.auth.context_processors.auth’, ‘django.contrib.messages.context_processors.messages’, ‘social_django.context_processors.backends’, # Добавил эту строку ], >, >, ]
Шаг 6 — Настройка ключей для ВКонтакте
Здесь дана настройка секретных ключей для ВКонтакте
SOCIAL_AUTH_VK_OAUTH2_KEY = ‘XXXXXXX’ SOCIAL_AUTH_VK_OAUTH2_SECRET = ‘XXXXXXXXXXXXXXXXXXXX’
Чтобы их получить, нужно создать в инструментарии разработчика ВКонтакте приложение и взять ID вашего приложения и секретный ключ для него. Регистрируем приложение

Что такое Backend?
SOCIAL_AUTH_VK_OAUTH2_KEY = ‘ID приложения’ SOCIAL_AUTH_VK_OAUTH2_SECRET = ‘Защищённый ключ’
Шаг 7 — Подключение маршрутов для авторизации в urls.py
Делается это так
urlpatterns = [ . path(», include(‘social_django.urls’)), ]
Шаг 8 — Добавление ссылки на маршрут
А теперь добавим ссылочку на маршрут где-нибудь в шаблоне, чтобы запускать авторизацию через ВКонтакте
Шаг 9 — Настройка редиректа при авторизации
Это необязательная настройка, которая укажет URL для перенаправления пользователя на вашем страницы после успешной авторизации. Оставим корень сайта
LOGIN_REDIRECT_URL = ‘/’
Там уже разберётесь, как вам лучше будет сделать
Шаг 10 — Запрос разрешений на получение доступа к email
У меня на сайте используется своя система рассылки сообщений уведомлений по почте, поэтому мне важно иметь доступ к email пользователю, чтобы уведомлять его о новых событиях на ресурсе, поэтому добавим запрос на получение доступа к email.
SOCIAL_AUTH_VK_OAUTH2_SCOPE = [’email’]
Для Django рекомендую VDS-хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
- Django — Урок 048. Как добавить статус онлайн на сайте
- Django — Урок 047. Как сделать select_related и prefetch_related для аутентифицированного пользователя
- Django — Урок 040. Как добавить аутентификацию через социальные сети. Facebook
- Django — Урок 037. Как добавить аутентификацию через социальные сети. Google+
- Django — Урок 009. Иконки социальных сетей «Поделиться» без JavaScript
По статье задано2 вопрос(ов)
Подписка на обсуждение 18
Подписка на раздел 169
Вам это нравится? Поделитесь в социальных сетях!
Источник: evileg.com
ВКонтакте проводит конкурс для бэкенд/full-stack разработчиков
Сообщество VK Tech анонсировало конкурс для бэкенд-разработчиков. Принять в нём участие можно как в одиночку, так и командой из двух человек (фронтенд и бэкенд).
Что нужно делать?
- В системе есть заказчики и исполнители. Заказчик публикует заказ и указывает его стоимость.
- Исполнитель видит список заказов, доступных для исполнения.
- Исполнитель выбирает заказ для выполнения, при этом исполнителю на счёт зачисляется стоимость заказа за вычетом комиссии системы.
- У одного заказа может быть только один исполнитель. Если заказ выполнен, он исчезает из списка.
С полным списком требований можно ознакомиться на специальной страничке.
Что мне за это будет?
ВКонтакте обещает вот такие призы:
- Первое место — 150 000 руб.
- Второе место — 100 000 руб.
- Поощрительные призы по 25 000 руб.
Ну а авторы лучших решений получат шанс присоединиться к Команде ВКонтакте.
Прислать свою работу на конкурс можно до 31 августа. Результат нужно отправить в сообщения сообщества VK Tech. Прикрепите к своему сообщению ссылку на GitHub (если репозиторий закрытый, пригласите в него пользователя seriousbackend) и развёрнутое демо. Укажите, написан ли код индивидуально или в составе команды.
Источник: tproger.ru
VK.com как бэкенд: подводные камни. Решаем проблемы по заявкам читателей
В прошлых статьях (раз и два) была описана разработка мобильного приложения со всеми любимым VK в роли бесплатного и услужливого сервера. Как это часто случается со всякими хитровыкрученными системами, рано или поздно они обрастают мелкими, но досадными проблемами, затрудняющими их использование. И как только это случается, журнал «Хакер» снова приходит на помощь :).
Версия VK API
При вызове какого-либо метода нужно специально указывать версию API в параметре v — например, последнюю v=5.53 . Иначе по умолчанию он ответит тебе версией, созданной еще при Дурове, а именно 3.0. Ее поддержку оставляют из-за очень старых программ, написанных давно, но работающих по сей день. Проблема с версией заключается в разных JSON-ответах сервера. Чтобы не встретиться с новой структурой при работе с методом wall.get , принудительно указывай версию и еще на всякий пожарный — число записей (count). Так API будет вести себя более предсказуемо.
Другие статьи в выпуске:
Xakep #214. Приручаем WAF’ы
- Содержание выпуска
- Подписка на «Хакер» -60%
Хранение записей со стены
Чтобы получить все записи со стены группы и иметь возможность обновлять данные, проще всего каждый раз выкачивать все записи со стены последовательно. Метод wall.get отдает данные с конца стены; используя смещение (offset), можно добраться до конца. Полное количество записей известно из переменной count ответа.
Каждую запись проще хранить в классе. Вот пример:
public class ProductStore implements Serializable, Comparable < private String id; private String category; private String subcategory; private String name; private String price; private String annotation; private String storeName; private String address; private String photo; private boolean selected; private Date startDate, endDate;
Он реализует два интерфейса: Serializable и Comparable. Первый используется для возможности сохранения всей его структуры целиком как строки в SharedPreferences, а второй — для упорядочивания списка по id . Его реализация:
Для обновления записей я каждый раз удаляю старую запись из списка (List
) и добавляю новую:
mProdList.remove(ps); mProdList.add(ps);
Так у нас появляется возможность увидеть обновление в записи. Правда, VK дает редактировать новые записи примерно сутки. Позже редактирование отключается и обновление становится недоступно, можно только публиковать заново.
Когда нужно поработать со всем массивом, я запускаю сортировку:
Collections.sort(mProdList);
Загрузка картинок
Для загрузки картинок могут использоваться разные библиотеки: Fresco, Picasso, Universal Image Loader. Я использую Glide, поскольку он поддерживает GIF. Кому-то важна стабильность работы библиотеки, кому-то размер (в том числе количество методов).
Я в работе столкнулся со странным поведением Glide при загрузке большого количества картинок в списках: картинки загружались хаотично, а некоторые вообще не отображались.
Поймать ошибку помог слушатель ответов загрузки. Устанавливается он так:
В лог тут же свалилось
Exception java.net.SocketTimeoutException: timeout
Диагноз ясен: мобильная сеть плохо получает данные с VK с помощью стандартного компонента работы с сетью.
Выход был в использовании компонента okhttp3. Для его использования нужно просто прописать его в Gradle:
Glide сам его подхватит при компиляции и будет использовать. Так стали загружаться все картинки, даже на самой плохой мобильной сети.
Продвинутая работа с Glide
Эта библиотека поддерживает загрузку эскизов изображений. Например, мы можем получить миниатюру GIF-файла и показать ее пользователю, пока загружается основной файл. Нам только нужно знать URL для загрузки картинки.VK API имеет для этого свойство thumb у объекта doc.
Добавить в объект записи новое поле, думаю, не составит особого труда, так как он был подробно описан в предыдущих статьях. Теперь нам нужно сделать предзапрос и его результат передать в основную загрузку. Glide сам заменит эскиз на основной документ после его загрузки.
// Запрос на картинку эскиза DrawableRequestBuilder thumbnailRequest = Glide .with(context) .load(item.getThumb()); // Основная загрузка Glide.with(catsViewHolder.image.getContext()) .load(item.getThumb()) .diskCacheStrategy(DiskCacheStrategy.SOURCE) .thumbnail(thumbnailRequest) .into(catsViewHolder.image);
Можно пойти еще дальше и сделать отображение загрузки основной картинки прямо поверх эскиза. Такие трюки доступны не всем, но настоящий хакер сможет разобраться с задачей, тем более что ее в общих чертах уже решил создатель библиотеки.
По рекомендации Балбеса из известного фильма, для тестов с загрузкой я использую кошек.
Получение аватара пользователя
При использовании vk-android-sdk первым делом проверяем, залогинился ли пользователь VKSdk.isLoggedIn. Если да, то нужно запустить метод VKApi.users().get() с дополнительными полями photo_50, photo_100, photo_200 . Если он не вернет нам в поле заглушку вроде -http://vk.com/images/camera_a.gif , то мы получим от него аватар в разрешении 50 х 50,100 х 100 или 200 х 200. Зависит это от самого аватара пользователя, раньше можно было загрузить и совсем маленькую картинку.
Вот метод, устанавливающий фото и имя пользователя в ImageView и TextView соответственно:
Еще не конец!
Вместо заключения хочу отметить, что бесплатный VK-бэкенд хорош в использовании, но несет с собой много трудностей. С нашим журналом ты узнаешь о большинстве из них и всегда будешь готов к праведной борьбе за торжество программерской мысли :).
Источник: xakep.ru