Вступление
Начну пожалуй с вопроса о том, для чего вообще нужна система аутентификации пользователей ?
-
Примерно для вот этого:
- Предоставлять экслюзивные возможности и доступ к закрытым ранее возможностям сайта. Например коментирование.
- Собрать базу данных о своих клиентах, причём уже лояльных к тебе.
- Быть постоянно на связи с пользователями. Можно отправлять им email рассылку или уведомления на сайт.
Иметь на своём сайте систему аутентификации важно, хотя бы потому что так вы будете расширять свою сеть клиентов/друзей/партнёров/читателей/заказчиков (подчеркнуть нужное)
Сразу оговорюсь, что система аутентификации, которую мы с тобой будем писать не основана на встроеном приложении django, django.contrib.auth . Это будет отдельное приложение с отдельной моделью к ней. Мы будем делать простую и понятную систему авторизации, основанную на анонимных сессионных ключах браузера.
Чтож, вернёмся к нашим баранам. Реализовать регистрацию и аутентификацию пользователей на django не сложно, хоть и требует спецефичных навыков. Для начала, нам потребуется проект, на котором мы вместе и реализуем аутентификацию пользователей.
Вот уже готовый базовый проект.
Или ссылка на репозиторий на github
И если ты всё ещё не скипнул до готового решения, прошу следовать за мной.
Как работает аутентификация на сессионных ключах
Теперь, чтобы ты понял о чём я буду дальше писать, нужно объяснить как вообще сессии работают в django и как мы их можем использовать для создания пользователей.
Сессия это маленький файл сгенерированный сервером, который хранит информацию о пользователе. Этот файл остаётся на сервере, дабы сервер знал с кем он общается. Под пользователем подразумевается браузер.
Процес общения пользователя и сервера
Более подробно я рассказываю о сессиях в django в главе настройке видов в django
Настройка скриптов и jQuery
Допустим у вас есть собственный сайт на котором нужно реализовать систему аутентификации. Создать страницу входа и страницу регистрации. Ну или вы скачали мой шаблонный проект и по нему хотите понять как аутентификация пользователей работает на практике. Встаёт вопрос, с чего начать ? Предлагаю начать с написания ajax запросов.
Но перед этим создадим соответствующие директории для хранения скриптов и подключим эти скрипты к нашим шаблонам. Положим ты сейчас в папке приложения Auth. Тогда:
В шаблоне signup.html вставь в самый конец перед endblock
В шаблоне login.html проделай тоже самое только вставь
Теперь когда всё необходимое было предварительно настроенно, можно переходить к сути или то как же сделать этот ajax запрос работать.
Ajax запрос для регистрации
Самое главное в самое начало. Код, ранее подключённого скрипта on_signup.js
Теперь разберёмся с ним по порядку.
Что такое csrftoken ? CSRF token (Cross-Site Request Forgery) – это уникальная, генерируемая сервером строка. Она позволяет защититься от подделки хацкерами запросов на сервер, для несанкционированного доступа к ресурсам пользователя сайта.
Чтобы форма смогла быть отправлена методом POST необходимо передать данный токен на сервер череза запрос.
Дальше мы собираем данные с заполненной формы и сохраняем в объект формы который и будем отправлять на сервер.
Определяем метод для отправки, адресс по которому будем обращаться на сервер. Его нужно запомнить, ибо нужно будет создать соответствующую функцию для обработки этого адресса.
Дальше, мы определяем поведение нашего скрипта. При возвращении кода 200, то есть пользователь успешно зарегистрировался, мы добавим надпись над формой и перенаправим его на главную страницу.
При неудаче, то есть при возвращении кода 406 ( в моём случае), мы дадим совсем другое сообщение для пользователя. Чтобы он исправил выявленные ошибки.
Ну и в конце, как я уже привык, настраиваю соответствующие события. В данном случае, нажатие кнопки Singup.
Ajax запрос для входа
Всё таже методика, только для подтверждения, то есть, входа на сайт.
И здесь будет отправляться чуть меньше данных чем при регистрации.
Создание и настройка django модели пользователя
Теперь, когда у тебя есть работающие запросы, нужно сделать соответствующую модель для пользователя.
В файле models.py добавь:
Не забуть применить миграции для базы данных
Настройка видов
Теперь у тебя есть модель пользователя, скрипты для отправки запросов на сервер, шаблоны, стили. В конце концов база сайта на django. Что ещё нам нужно? Я оставил самое главное на потом, а именно валидацию, аутентификацию и авторизацию пользователей. Всё это происходит на сервере. Я добавил ещё 3 путя в urls.py в приложении Auth. Итого ваш Auth/urls.py должен выглядеть примерно так:
Теперь разберём каждый из них по отдельности. Обсудим все нюансы, так сказать.
Вид для регистрации
Если описать в общем данную функцию, то это набор самых разнообразных проверок. Таких как, длина пароля, соответствие формата адреса почты и прочие. И если все проверки пройдены, создаётся пользователь.
Вид для входа
Функция login это тоже куча проверок на правильность введённых данных. За тем исключением что мы создаём дополнительные переменные в текущей сессии, такие как is_auth и username. И если всё введённые данные верны, функция вернёт соответствующее сообщение и код.
Вид для выхода
Здесь всё довольно просто. Мы говорим серверу чтобы он очистил(забыл) об текущей сессии с пользователем, а потом перенаправил на главную.
Пример использования аутентификации
Теперь, когда наш сайт может регистрировать новых пользователей и определять вход уже существующий, встаёт вопрос. А что собственно говоря делать дальше ?
Во-первых, предлагаю менять надпись login на logout. Для этого модифицируем нашу домашнюю страницу. В home.html Вместо
Вставьте
Во-вторых предлагаю отобразить имя и почту нашего пользователя.
Вставьте этот кусочек шаблона после последнего элемента списка
А в Main/views.py нужно будет улучшить функцию home
Сначала мы импортировали модель Users. Потом находим пользователя по сохранённому нами ранее значению в сессии, username. Мы его получили при логировании, если ты ещё не забыл.
Перезагрузив страницу и залогинившись, вы будете перенаправлены на главную и увидите что-то вроде этого
Вот такое вот базовое применение системы аутентификации. Ещё можно много чего сделать с этим. Например, создать отдельную страницу для каждого пользователя или предоставить возможность коментирования. Но это уже выходит за рамки данной статьи. Моя цель была показать тебе, как можно реализовать систему аутентификации пользователей самостоятельно на django, а уже как её использовать тебе решать.
Выводы
Теперь, у вас есть всё необходимое для создания собственных форм регистрации и авторизации пользователей. Это было не сложно, правда ? Хотя, с не привычки, может показаться иначе. Подытоживая.
-
Потери:
- Вы потратили 30 минут своей жизни.
- Примерно 100 Mb пространства на жёстком диске
-
Приобретения:
- Узнали, изучили а главное попробывали на практике использовать сессии и куки
- Приложение django и навыки для его подключения в ваш проект
- Приобрели шаблоны и скрипты на которые можно будет ссылаться, и которые можно использовать как базу для своих собственных
- Обновлять контент на странице не перезагружая её
- Навыки написания шаболнов и форм для регистрации и авторизации
- Умения обрабатывать ajax запросы на python
- Умение составлять ajax запросы, POST и GET
Надеюсь, затраченое время было затрачено не зря. И вы что-нибудь да и извлекли для себя.
Для ищущих готовое решение
Вот ссылка на скачивание готового django приложения.
Или ссылка на скачивание всего django проекта, уже готового.
Или если не хотите бездумно скачивать файлы с неизвестных сайтов, вот ссылка на github репозиторий.
Если вы решили скачать приложение, поздравляю вы улавливаете основную особенность django, а именно его модульность. Вот так можно будет его подключить к вашему сайту.В settings.py добавить приложение
В urls.py на уровне проекта, подключить маршруты.
Всё готово, и настроенно.
Использованые материалы и полезные ресурсы
- Как загружать файлы
- Как отправить запрос
- События в jQuery
- Манипуляция элементов страниц
- Использование crfs-token с django
- Неплохое начало для тех кто только начинает