Приложение авторизации Django
Django автоматически устанавливает auth приложение при создании нового проекта. Посмотрите в mysite/settings.py в разделе INSTALLED_APPS, и вы увидите, auth что это одно из нескольких встроенных приложений, которые Django установил для нас:
Чтобы использовать встроенное auth приложение, нам нужно добавить его в наш urls.py файл проекта. Не забудьте добавить include вторую строку.
Я решил включить auth приложение в accounts/, но вы можете использовать любой шаблон URL, который хотите. Также мы изменим адрес нашего блога, с http://127.0.0.1:8000/blog/ на http://127.0.0.1:8000/:
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('blog.urls', namespace='blog')),
path('sitemap.xml', sitemap, {'sitemaps': sitemaps},
name='django.contrib.sitemaps.views.sitemap'),
path("accounts/", include("django.contrib.auth.urls")), # new
]
Приложение auth, которое мы сейчас включили, предоставляет нам несколько представлений аутентификации и URL-адресов для управления входом в систему, выходом из системы и управлением паролями.
URL-адреса, предоставленные auth:
accounts/login/ [name='login']
accounts/logout/ [name='logout']
accounts/password_change/ [name='password_change']
accounts/password_change/done/ [name='password_change_done']
accounts/password_reset/ [name='password_reset']
accounts/password_reset/done/ [name='password_reset_done']
accounts/reset/<uidb64>/<token>/ [name='password_reset_confirm']
accounts/reset/done/ [name='password_reset_complete']
Для каждого шаблона URL также есть связанные представления аутентификации. Это означает, что нам нужно только создать шаблон для использования каждого!
Страница авторизации
Давайте сделаем нашу страницу входа! Django по умолчанию будет искать в папке шаблонов, называемой registration шаблонами аутентификации. Шаблон входа назовем login.html.
Создайте новый каталог с именем registration в нашей папке шаблонов templates.
В итоге наша файловая структура шаблонов будет выглядеть так:
Затем вtemplates/registration/login.html добавьте следующий код:
{% extends "blog/base.html" %}
{% block title %} Login {% endblock %}
{% block content %}
<h2> Login </h2>
<form method="post">
{{ form.as_p }}
{% csrf_token %}
<p><input type="submit" value="Login"></p>
</form>
{% endblock %}
Это стандартная форма Django, использует метод POST для отправки данных и {% csrf_token %} тегов из соображений безопасности, а именно для предотвращения атаки CSRF.
Содержимое формы выводится между тегами абзаца благодаря, {{ form.as_p }} а затем мы добавляем кнопку LOGIN:
Перейдем по адресу http://127.0.0.1:8000/accounts/login/ и проверим работу:
Наша функция входа в систему теперь работает, но чтобы сделать ее лучше, мы должны указать, куда перенаправлять пользователя после успешного входа в систему.
Другими словами, когда пользователь вошел в систему, куда он должен быть отправлен на сайте.
Мы используем LOGIN_REDIRECT_URL настройку, чтобы указать этот маршрут.
Внизу файла settings.py добавьте следующее, чтобы перенаправить пользователя на домашнюю страницу:
LOGIN_REDIRECT_URL = "/"
А теперь давайте проверим, мы можем войти под данными суперпользователя, которые создавали в разделе 5.3.1 "Сайт администрирования".
Если мы правильно введем логин и пароль, мы будем перенаправлены на главную страницу. И если после этого мы перейдем в нашу админ-панель, http://127.0.0.1:8000/admin/, то мы увидим что никакой авторизации не требуется.
Выход
Но как выйти из системы? В настоящее время единственный вариант — зайти в панель администратора http://127.0.0.1:8000/admin/ и нажать на ссылку LOG OUT в правом верхнем углу:
Давайте добавим на нашу страницу ссылку для выхода, чтобы пользователи могли легко переключаться между двумя состояниями.
Возможности auth уже предоставляют нам встроенный URL-адрес и представление для этого. Нам не нужно ничего отображать при выходе из системы, поэтому нет необходимости в шаблоне. Все, что мы действительно делаем после успешного запроса на «выход из системы», — это перенаправление на другую страницу.
Давайте отредактируем наш базовый шаблон, base.html и изменим часть кода нашего сайдбара:
.
..
...
<div id="sidebar">
<h2>My blog</h2>
<p>
This is my blog.
I've written {% total_posts %} posts so far.
</p>
<hr>
{% if user.is_authenticated %}
Hi {{ user.username }}!
<form action="{% url 'logout' %}" method="post">
{% csrf_token %}
<a href="#" onclick="parentNode.submit();">Log Out</a>
</form>
{% else %}
<p>You are not logged in</p>
<a href="{% url 'login' %}">Log In</a>
{% endif %}
<hr>
<h3>Latest posts</h3>
...
..
.
Начиная с версии Django 5, чтобы выйти из системы мы должны отправить POST запрос. До этого можно было обойтись простым GET запросом. Затем обновите settings.py нашу ссылку перенаправления, которая называется LOGOUT_REDIRECT_URL.
Добавьте его прямо рядом с нашей переадресацией входа, чтобы нижняя часть файла settings.py выглядела следующим образом:
LOGIN_REDIRECT_URL = "/"
LOGOUT_REDIRECT_URL = "/"
Теперь, если вы повторно посетите блог и войдете в систему, вы будете перенаправлены на новую домашнюю страницу, на которой есть ссылка Log Out для вошедших в систему пользователей:
Нажав на нее, вы вернетесь на домашнюю страницу со ссылкой Log In:
Добавив всего несколько строк кода у нас появилась надежная система аутентификации, поскольку встроенные возможности auth сделали за нас большую часть тяжелой работы.
Одна из приятных особенностей Django заключается в том, что, несмотря на то, что он предоставляет множество готовых функций, его также можно настраивать.
В следующем шаге, мы узнаем, как добавить страницу регистрации для новых пользователей.