Использование встроенной системы аутентификации Django

lepiloff

Dec. 1, 2017, 12:07 p.m.

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 %}

django