Документация по django-ulogin¶
https://github.com/marazmiki/django-ulogin
Описание¶
django-ulogin — подключаемое универсальное django-приложение для социальной аутентификации пользователей с помощью внешнего интернет-сервиса uLogin
Внимание
Создатели приложения никак не связаны с интернет-сервисом uLogin, поэтому все вопросы, касающиеся непосредственно работы сервиса, а не этого приложения, просьба отправлять на team@ulogin.ru.
Содержание¶
Системные требования¶
- Разработка и тестирование проводилось под управлением OS Ubuntu, Debian, Mac OS. Production-использование — Ubuntu, Debian, RHEL, FreeBSD. Приложение не использует каких-либо специфичных для той или иной операционной системы особенностей языка, поэтому, скорее всего, всё будет работать и на остальных системах, для которых существуют требуемые версии Python
- Интерпретатор Python
2.7+
,3.4
,3.5
,3.6
. На других интерпретаторах работоспособность не проверялась. Django 1.7+
, включая поддержкуDjango 2.x
(доступно только дляPython 3.4+
)- Библиотека python-requests
Установка¶
Установка текущей стабильной версии django-ulogin производится из PyPI с помощью утилиты pip
:
$ pip install django-ulogin
Для установки dev-верии из репозитория нужно добавить к командной строке ключ -e
:
$ pip install -e git+github.com/marazmiki/django-ulogin.git#egg=django-ulogin
Если нужно установить какую-то конкретную ревизию, просто укажите её в URL репозитория:
$ pip install -e git+github.com/marazmiki/django-ulogin.git@{rev}#egg=django-ulogin
Все внешние зависимости будут утановлены автоматически
Конфигурация проекта¶
Для подключения к проекту откройте settings.py
и добавьте в кортеж INSTALLED_APPS
приложение django_ulogin
INSTALLED_APPS += [
'django_ulogin'
]
Внимание
Атрибут INSTALLED_APPS
по умолчанию стал списком (list
) начиная с Django версии 1.9
. В более ранних версиях он является кортежем (tuple
), поэтому, если Вы не изменяли тип, добавлять надо кортеж:
INSTALLED_APPS += (
'django_ulogin'
)
Для работы django-ulogin
необходим подключенный контекст-процессор django.template.context_processors.request
:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
# ...
'django.template.context_processors.request',
],
},
},
]
Внимание
В старых версих Django до версии 1.9 включительно, не было поддержки нескольких систем рендеринга шаблонов,
а требуемый контекст-процессор располагался в django.core.context_processors.request
. Таким образом,
подключение выглядит примерно следующим образом:
TEMPLATE_CONTEXT_PROCESSORS = (
# ...
'django.core.context_processors.request',
)
Добавьте схему URL-адресов к списку urlpatterns
Вашего проекта (urls.py
):
urlpatterns += [
url(r'^ulogin/', include('django_ulogin.urls')),
]
Затем следует синхронизировать базу данных
$ ./manage.py migrate
Использование¶
Внимание
На текущий момент поддерживается работа с единственым шаблонным движком, встроенным в Django. Речь идёт именно о нём.
Быстрый старт¶
Для использования приложения достаточно в любом месте шаблона вставить подключение шаблонной библиотеки ulogin_tags
и вызов тега ulogin_widget
.
{% load ulogin_tags %}
{% ulogin_widget %}
На месте тега ulogin_widget
при рендеринге появится код интеграции dашего сайта c uLogin.
Тег {% ulogin_widget %}
принимает один необязательный аргумент — scheme_name
, который указывает на имя используемой схемы настроек.
{% ulogin_widget "scheme_name" %}
Использование различных схем особенно удобно, если нужно на одной странице разместить несколько виджетов, обладающих различными настройками.
Для опытных пользователей¶
Тонкая настройка¶
По умолчанию django_ulogin
требует от сервиса только одно обязательное поле - email
. Вы можете указать для проекта список как необходимых полей (определив в settings
список ULOGIN_FIELDS
), так и опциональных (ULOGIN_OPTIONAL
):
# Поля first_name и last_name обязательны
ULOGIN_FIELDS = ['first_name', 'last_name']
# Необязательные поля: пол, URL аватара, дата рождения
ULOGIN_OPTIONAL = ['sex', 'photo', 'bdate']
Список всех полей, которые сообщает ULOGIN:
first_name
last_name
email
nickname
bdate
(дата рождения, передаётся в формате dd.mm.yyyy)sex
(пол: 1 означает женский, 2 - мужской)photo
(аватар, размер 100х100 пикселей)photo_big
city
country
phone
Внешний вид виджета определяется параметром ULOGIN_DISPLAY
. Доступно три варианта:
small
(по умолчанию)panel
button
Также можно задать стиль кнопок, установив значение переменной ULOGIN_THEME
. Принимаются два варианта:
classic
(по умолчанию)flat
Список используемых провайдеров определяется директивой ULOGIN_PROVIDERS
. По умолчанию включены:
vkontakte
facebook
twitter
google
livejournal
Дополнительные провайдеры, которые будут показаны внутри выпадающего меню, определяются в директиве ULOGIN_HIDDEN
. По умолчанию:
yandex
odnoklassniki
mailru
openid
Директивой ULOGIN_REDIRECT_URL
можно задать URL, на который пользователь будет переадресован после успешной аутентификации. Лучше
всего указать полностью, вместе с доменом и схемой.
Если при входе нужно выполнить какую-то JavaScript-функцию, укажите её в виде строки в переменной ULOGIN_CALLBACK
.
Если необходимо создать функцию, создающую пользователя Django (это полезно при использовании нестандартной модели), можно
указать полный путь до неё в переменной ULOGIN_CREATE_USER_CALLBACK
(см. ниже)
Схемы¶
Как упоминалось выше, в некоторых случаях нужно разместить на одной странице несколько виджетов ulogin с различными настройками. В этом случае целесообразно создать нужное количество схем и настроить их.
Схемы определяются как словарь ULOGIN_SCHEMES
, ключи которого — названия схем, используемые в шаблонном теге {% ulogin_widget "scheme_name" %}
, а значения - словари с настройками.
Ключи этого словаря совпадают с названиями соответствующих «глобальных» настроек, но без префикса ULOGIN_
. Это означает, что в пределах настройки схемы ключ DISPLAY
будет отвечать за вид панели виджета, как и его глобальный «коллега» ULOGIN_DISPLAY
Кроме того, настройки схем наследуют глобальные настройки. Например, такая настройка:
ULOGIN_PROVIDERS = ['google', 'twitter']
ULOGIN_HIDDEN = ['odnoklassniki', 'mailru']
ULOGIN_DISPLAY = 'panel'
ULOGIN_SCHEMES = {
'default': {'HIDDEN': ['yandex']},
'comments': {'DISPLAY': 'small'}
}
означает, что по умолчанию включены провайдеры google
и twitter
, odnoklassniki
и mailru
скрыты, а виджет выводится в раскладке panel
.
Однако при использовании схемы default
скрытым провайдером окажется yandex
, а схема comments
будет выведена в раскладке small
. Настройки, которые не переопределены, будут браться из глобальной области.
Если в проекте используются бэкенды аутентификации, отличные от стандартных, можно указать настройку ULOGIN_AUTHENTICATION_BACKEND
, которая будет использована для хранения в сессии информации о том, через какой бэкенд аутентифицировался пользователь.
Сигналы¶
При аутентификации пользователя создаётся новый Django-пользователь, username
которого заполняется uuid4-хешем. Однако при создании новой аутентификации срабатывает сигнал django_ulogin.signals.assign
, в котором передаётся объект request
, пользователь Django, аутентификация и флаг registered
, показывающий, была ли создана запись.
Чтобы сделать имя поля дружественным пользователю, достаточно создать объект, подписанный на сигнал django_ulogin.signals.assign
:
from django_ulogin.models import ULoginUser
from django_ulogin.signals import assign
def catch_ulogin_signal(*args, **kwargs):
"""
Обновляет модель пользователя: исправляет username, имя и фамилию на
полученные от провайдера.
В реальной жизни следует иметь в виду, что username должен быть уникальным,
а в социальной сети может быть много "тёзок" и, как следствие,
возможно нарушение уникальности.
"""
user=kwargs['user']
json=kwargs['ulogin_data']
if kwargs['registered']:
user.username = json['username']
user.first_name = json['first_name']
user.last_name = json['last_name']
user.email = json['email']
user.save()
assign.connect(receiver=catch_ulogin_signal,
sender=ULoginUser,
dispatch_uid='customize.models')
Можно изучить тестовый проект, в котором реализована функция сохранения данных, полученных от uLogin:
Создание нестандартной модели пользователя¶
По умолчанию при аутентификации пользователя через социальные сети будет создаваться стандартный пользователь Django; в качестве имени будет использоваться обрезанный до 30 символов (ограничение длины поля username
в стандартной модели пользователя) UUID4-хеш.
Однако если Вы используете собственную модель, отличную от django.contrib.auth.models.User
, в которой содержатся другие поля, то можете написать собственную функцию, которая создавала бы пользователя по Вашему сценарию.
Требования к этой функции:
- она должна принимать два аргумента:
request
иulogin_response
для передачи объектаHttpRequest
иJSON
, полученного от uLogin соответственно; - возвращать сохранённую модель пользователя
Пример:
from my_projects.models import MyUser
def my_user_create(request, ulogin_response):
return MyUser.objects.create_user(
username='Vasya_{0}'.format(uuid.uuid4()),
birthday=datetime.date.today()
)
После этого в настройках проекта в переменной ULOGIN_CREATE_USER_CALLBACK
указать полный путь этой функции:
ULOGIN_CREATE_USER_CALLBACK = "my_projects.utils.my_user_create"
Хотите помочь с django-ulogin?¶
Если у вас есть желание преобщиться к чудесному миру opensource, или же приложение не устраивает вас в текущем его виде, то вы можете внести свою лепту в его улучшение.
Сообщайте об ошибках¶
Если вы нашли ошибку, или считаете, что всё должно быть совсем не так, или просто хотите что-то предложить, то к вашим услугам тикет-система на Гитхабе: https://github.com/marazmiki/django-ulogin/issues.
Пишите код¶
Есть желание поучаствовать в разработке приложения? Форкайте исходные коды https://github.com/marazmiki/django-ulogin и пишите свой. Может, он исправит какую-то ошибку, или описку в документации. А может, реализует какую-то незамеченную, но очень важную новую возможность в программе.
После того, как вы внесёте необходимые изменения в код, смело делайте пулл-реквест, чтобы ваши изменения попали в основной репозиторий и принимайте благодарности.
Рекомендации для написания кода¶
- Пишите код таким образом, чтобы он соответствовал PEP-0008. Обращайте внимание на советы по оформлению кода, которые даёт IDE (если пользуетесь). Также можно пользоваться линчевателями
pylint
иflake8
. Если у вас установлен GNU Make (обычно легко ставится или изначально присутствует на большинстве unix- и linux-систем), можете воспользоваться командойmake flake8
, которая найдёт все ошибки:
$ make flake8
- Не пренебрегайте тестами и не забывайте их запускать. В идеале, тест должен быть написан до написания собственно кода. Быстрый запуск тестов на текущем окружении можно выполить таким образом:
$ python setup.py test
или, если установлен GNU Make, таким:
$ make test
Однако, поскольку django-ulogin
является библиотекой и должна работать в различных окружениях (несколько версий Django, различные версии языка Python), необходимо также проверить, что код будет выполняться там. Это делается с помощью утилиты tox.
$ tox
Создание всех окружений и прогон на них тестов занимает некоторое время (около 10-15 минут, в зависимости от мощности компьютера и качества подключения к сети). Список поддерживаемых конфигураций, на которых должно отрабатывать приложение, задаётся в секции [tox:tox]
файла setup.cfg
из корня репозитория.
- Когда Вы сделаете PULL REQUEST, сервис для неприрывных интеграций Travis CI автоматически проверит, работает ли программа на всех заявленных окружениях. И если увидите красную полосу, исправьте, пожалуйста, ошибки.
- Ну и, конечно, не забудьте добавить себя в список авторов, который хранится в
docs/source/authors.rst
. Желательно с указанием настоящего имени и e-mail
История изменений¶
1.x¶
1.1.0¶
1.0.7¶
- Поддержка
Django==3.1
1.0.6¶
- Security-обновление: внешняя зависимость
bleach
обновлена до безопасной версии3.1.4
1.0.5¶
- Security-обновление: внешняя зависимость
bleach
обновлена до безопасной версии3.1.2
1.0.4¶
1.0.3¶
- Добавлена поддержка
Python 3.8
иDjango 3.0
1.0.2¶
Технический релиз, ничего заметного для пользователей тут нет
- Добавлены новыве бейджи
- Исправлена интеграция с Travis CI и Read The Docs
1.0.1¶
- Добавлена поддержка
Django 2.2
1.0.0¶
- Добавлена поддержка стиля кнопок (классические или плоские)
- Добавлена поддержка новых провайдеров:
uID
,Instagram
иWargaming.get
- Удалена поддержка провайдера
dudu
- Добавлена поддержка
Python 3.6
иPython 3.7
иDjango 2.0
и2.1
. Спасибо Максиму Полежаеву, PR #39 - Удалена поддержка версий
Python
ниже3.4
иDjango
ниже1.7
- В приложение добавлены миграции (ранее не хотелось этого делать из-за необходимости поддерживать как встроенные миграции
Django 1.7+
, так иSouth
для более ранних версийDjango
- Обновлена документация
- PyPI-классификатор
Development Status
переведён в значение5 - Production/Stable
. Не, ну правда, сколько можно уже? :) - Максимально облегчен
setup.py
, а вся метаинформация о пакете, а также настройкиbumpversion
,tox
иcoverage
вынесены вsetup.cfg
- Исправлены бейджи
0.3x¶
0.3.0¶
- Удалена поддержка
Python 2.6
- Добавлена поддержка
Python 3.5
- Удалена поддержка
Django
версий1.5
и1.6
- Расширенная документация на Read the Docs
- Добавлена поддержка
Django 1.9
. Спасибо за помощь Максиму Оранскому, PR #27 - Исправлена ошибка
urllib.unquote
в Py3 (спасибо mcd-php) - Дефолтное имя (UUID) обрезано до 30 символов для совместимости с длиной поля username по умолчанию. Спасибо Haos616)
- Исправлена ошибка при обращении к urllib.unquote в Python 3.x. Исправил mcd-php, PR #32
- Исправлена ошибка, приводящая к UnicodeDecodeError при использовании Python 3.x. Исправил mcd-php, PR #33
- Исправлены бейджи
0.2x¶
0.2.3¶
- Обновлена HEAD-версия Django
0.2.2¶
- Обновлена HEAD-версия Django
0.2.1¶
- Удалена поддержка
python 3.2
, добавлена поддержка3.4
- Улучшен
PEP-0008
- Добавлен
coverage
0.1x¶
0.1.9¶
- Добавлена обработка подтверждения почты (параметр
verify=1
, см. http://ulogin.ru/help.php#faq)
0.1.8¶
- Добавлены провайдеры
Google+
,Foursquare
,Tumblr
,Dudu
;
- Отказ от поддержки
Django 1.4x
и ниже; - Улучшение кода по
PEP-0008
- Изменение кода виджета
- Поддержка собственной модели пользователя
Django
- Обновлён демонстрационный проект
0.1.7¶
- Исправена ошибка, связанная с декодированием uri, в котором встречаются не ascii-символы (исправил mike-grayhat)
0.1.6¶
- Добавлен параметр
ULOGIN_AUTHENTICATION_BACKEND
- Грамотная работа с timezones при
USE_TZ=True
(в Django 1.4)
0.1.5¶
- Отказ от поддержки
Django 1.2x
- использованы class based views.
- Можно входить в свой аккаунт через различных провайдеров.
- Можно отвязывать аккаунты в соц. сетях от своего пользователя
- Новое поле:
phone
- Новые провайдеры:
*
flickr
*vimeo
*webmoney
*youtube
*steam
*soundcloud
*lastfm
*linkedin
*liveid
JS
виджета подключается поHTTP
илиHTTPS
в зависимости от того, какой схемой пользуется посетитель- Исправлены неточности в документации (добавлено про обязательные контекст-процессоры)
- Соответствие
pep-0008
:)
0.1.4¶
- Добавлена поддержка схем виджетов (позволяет разместить на одной странице несколько разных виджетов)
- Обновлена документация
- Изменён HTML-код в соотстветствии с требованиями
ulogin
Авторы¶
Список замечательных людей, принявших участие в развитии проекта:
- Михаил «marazmiki» Пороховниченко <marazmiki@gmail.com>
- Игорь «itoldya» Исаев <i-told@ya.ru>
- Михаил «mike-grayhat» Оськин
- Виталий «vetal4444» Савченко <vetal4444@gmail.com>
- Антон «Forever-Young» Новосёлов <anton.novosyolov@gmail.com>
- Денис «dkopitsa» Копица <denis.kopitsa@gmail.com>
- Максим «sdfsdhgjkbmnmxc» Оранский <maxim.oransky@gmail.com>
- Максим «maxpolezhaev » Полежаев <m.polejaev@gmail.com>
- Haos616 <Haos616@Gmail.com>
- mcd-php