Django: регистрация и аутентификация пользователей
Date and time: Dec. 28, 2014, 5:53 p.m. | Category: Веб-разработка, Django
В данной статье будет описан процесс реализации возможности регистрации и аутентификации пользователей наиболее простейшим образом.
К счастью для нас, если мы используем стандартную модель (или её расширение) пользователя django, то дописывать придётся совсем немного. Если же у вас модель абсолютно не связана со стандартной, то читать далее не имеет смысла.
1. Регистрация
Начнём с регистрации. Django "из коробки" предоставляет форму создания пользователя UserCreationForm, которую мы и будет использовать для регистрации. Плюс ко всему, она автоматически делает все необходимые проверки. Например, зарегистрирован ли уже пользователь с данным именем. Построенное на основе данной формы представление будет иметь следующий вид:
from django.views.generic.edit import FormView
from django.contrib.auth.forms import UserCreationForm
class RegisterFormView(FormView):
form_class = UserCreationForm
# Ссылка, на которую будет перенаправляться пользователь в случае успешной регистрации.
# В данном случае указана ссылка на страницу входа для зарегистрированных пользователей.
success_url = "/login/"
# Шаблон, который будет использоваться при отображении представления.
template_name = "register.html"
def form_valid(self, form):
# Создаём пользователя, если данные в форму были введены корректно.
form.save()
# Вызываем метод базового класса
return super(RegisterFormView, self).form_valid(form)
Как видно, зарегистрировать пользователя достаточно просто. Теперь необходимо добавить ссылку на представление в urls.py:
from django.conf.urls import patterns, include, url
urlpatterns = patterns('',
...
url(r'^register/$', views.RegisterFormView.as_view()),
...
)
И тег {{ form }} в шаблон register.html:
<!DOCTYPE html>
<html>
<head>
<title>Регистрация</title>
</head>
<body>
<form action="" method="post">
{% csrf_token %}
<!-- as_p для того, чтобы каждый элемент формы был с новой строки -->
{{ form.as_p }}
<button type="submit">Зарегистрироваться</button>
</form>
</body>
</html>
Таким образом, перейдя на страницу ваш.сайт/register/ можно будет увидеть форму регистрации, которая, если повезёт, даже будет работать. Однако, выглядеть она будет страшновато. Как применить к ней форматирование и стили CSS можно догадаться из статьи Django: создание формы обратной связи или почитав документацию.
2. Аутентификация
Принципы реализации аутентификации абсолютно те же самые, но реализация немного сложнее (за счёт использования некоторых дополнительных функций). Без лишних слов, смотрим на код и читаем комментарии:
# Опять же, спасибо django за готовую форму аутентификации.
from django.contrib.auth.forms import AuthenticationForm
# Функция для установки сессионного ключа.
# По нему django будет определять, выполнил ли вход пользователь.
from django.contrib.auth import login
class LoginFormView(FormView):
form_class = AuthenticationForm
# Аналогично регистрации, только используем шаблон аутентификации.
template_name = "login.html"
# В случае успеха перенаправим на главную.
success_url = "/"
def form_valid(self, form):
# Получаем объект пользователя на основе введённых в форму данных.
self.user = form.get_user()
# Выполняем аутентификацию пользователя.
login(self.request, self.user)
return super(LoginFormView, self).form_valid(form)
Осталось, аналогично регистрации, добавить ссылку в urls.py и создать шаблон login.html (кстати говоря, подойдёт и представленный выше шаблон регистрации без каких-либо изменений).
3. Выход
Для полного счастья осталось добавить возможность выхода (для ещё большего счастья смену и восстановление пароля, но об этом ниже). Для выхода не требуется никаких форм и шаблонов, поэтому представление для него делается буквально в четыре строки:from django.http import HttpResponseRedirect
from django.views.generic.base import View
from django.contrib.auth import logout
class LogoutView(View):
def get(self, request):
# Выполняем выход для пользователя, запросившего данное представление.
logout(request)
# После чего, перенаправляем пользователя на главную страницу.
return HttpResponseRedirect("/")
Не забудьте добавить ссылку на данное представление в urls.py.
4. Заключение
Скопировав и склеив всё это, можно получить минимальную систему "чтобы работало" с большим потенциалом для улучшения. Например, можно реализовать страницы восстановления и изменения пароля аналогичным образом на основе форм PasswordResetForm и PasswordChangeForm из django.contrib.auth.forms.
comments powered by Disqus