Django предоставляет нам удобную встроенную систему авторизации и аутентификации пользователя, которой вполне достаточно для большинства проектов. Она включает в себя такие разделы как:
Вход
Выход
Регистрация
Сброс пароля
В этой статье будет описан процедура входа на сайт зарегистрированных пользователей и процедура выхода из аккаунта.
Для начала, необходимо убедиться, что в INSTALLED_APPS
файла settings.py
добавлен django.contrib.auth
и в MIDDLEWARE
содержится auth
Если проект создавался командой startproject, и вы ничего не меняли самостоятельно, то необходимые настройки у вас есть.
Конфигурация urls.py
Внесем необходимые изменения в urls.py, выполнив импорт представлений. В приведенном примере конфигурация происходит в файлах ранее созданного приложения registrations
. Эти же настройки можно делать и в главном файле urls.py проекта.
from django.conf.urls import url
from django.contrib.auth.views import LoginView
app_name = 'registrations'
urlpatterns = [
url(r'^login/$', LoginView.as_view(), name='login'),
]
Создание шаблона страницы входа
По умолчанию вьюха django.contrib.auth.views.login
использует шаблон registration/login.html. Поэтому, для работы с базовым функционалом, создадим папку registrations
с файлом login.html в папке со всеми нашими шаблонами (обычно templates).
login.html
{% extends 'base.html' %}
{% block title %}Login{% endblock %}
{% block content %}
<h2>Login</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Login</button>
</form>
{% endblock %}
Кастомизация настроек
Если нас не устраивает функционал или внешний вид представления LoginView
, ее работу можно кастомизировать на свой вкус с помощью дополнительных атрибутов. Например переопределим шаблон registration/login.html атрибутом template_name
:
url(r'^login/$', LoginView.as_view(template_name='registrations/login.html'), name='login'),
Еще одна важная часть - добавление в settings.py
значения LOGIN_REDIRECT_URL
по которому будет происходить редирект после успешного входа в систему. Значение по умолчанию - /accounts/profile/. Для перехода на главную:
LOGIN_REDIRECT_URL = '/'
Выход из аккаунта
Выполним дополнительный импорт в urls.py нужного представления LogoutView
from django.conf.urls import url
from django.contrib.auth.views import LoginView, LogoutView
app_name = 'registrations'
urlpatterns = [
url(r'^login/$', LoginView.as_view(), name='login'),
url(r'^logout/$', LogoutView.as_view(), name='logout'),
]
Можно использовать шаблон страницы, на которую переходит пользователь после выхода с помощью атрибута template_name
, или перенаправлять на любую страницу атрибутом next_page
:
url(r'^logout/$', LogoutView.as_view(next_page='/'), name='logout'),
Теперь сделаем так, что бы на каждой странице сайта отображались поля Войти если пользователь не вошел в аккаунт и Выйти - если пользователь залогинился.
Добавим в шаблон base.html:
{% if user.username %}
<a href="{% url 'registrations:logout' %}">Выйти</a>
{% else %}
<a href="{% url 'registrations:login' %}">Войти</a>
{% endif %}
{% if user.is_authenticated %}
<p>Welcome, {{ user.username }}. Thanks for logging in.</p>
{% else %}
<p>Welcome, new user. Please log in.</p>
{% endif %}