На любом сайте, где есть пользователи, так же существует функционал по работе с ними. Это может быть функционал по регистрации пользователей, входу и выходу из системы и процессу восстановления пароля. Каждый процесс так же может быть связан с идентификацией пользователя, аутентификацией и авторизацией.
Так как это базовый функционал, который нужен большинству сайтов, в Django уже есть простой способ реализовать это. В статье будет показано как можно реализовать страницы входа (login) и выхода (logout) пользователей для Django 4+. Для младших версий различия могут быть не существенными.
Тестовый проект
Последующие примеры показаны на следующем проекте:
django-admin startproject testproject
cd .\testproject\
В файле 'settings.py' указан путь до шаблонов:
TEMPLATES = [
...
'DIRS': [BASE_DIR / 'templates'],
...
]
Никакое приложение не нужно т.к. будет использоваться только urls.py, шаблоны и существующие классы.
Выполните миграцию для создания таблицы пользователей, а затем создайте самого пользователя.
python manage.py migrate
python manage.py createsuperuser
Изменение urls.py
Вьюшки, которые могут обрабатывать вход и выход пользователя, находятся по пути 'django.contrib.auth.views'. Нам нужны две конкретные вьюшки 'LoginView' и 'LogoutView'. Пример того, как вы можете реализовать их у себя.
from django.contrib import admin
from django.urls import path
from django.contrib.auth import views as auth_views
urlpatterns = [
path('admin/', admin.site.urls),
path('login/', auth_views.LoginView.as_view(), name='login'),
path('logout/', auth_views.LogoutView.as_view(), name='logout'),
]
Если посмотреть вьюшку 'django.contrib.auth.views' подробнее, то можно увидеть и другие классы, которые вам так же могут понадобиться. Это может быть функционал регистрации пользователей, сброса пароля, ввода нового пароля и т.д. Если вам нужно реализовать весь подобный функционал, то вы можете просто выполнить 'include('django.contrib.auth.urls'))'. Например:
...
urlpatterns = [
path('admin/', admin.site.urls),
path('user/', include('django.contrib.auth.urls')),
]
Создание шаблонов
По умолчанию шаблоны для входа и выхода ищутся по следующим путям (тестовый проект использует папку 'templates' для шаблонов):
- templates/registration/login.html
- templates/registration/logout.html
Чаще всего шаблон "Logout" не создается т.к. нам не нужно отдельной страницы для уведомления пользователя о выходе. Мы просто отправляем его на главную страницу и завершаем его сессию.
Учитывая, что мы используем модули аутентификации самого Django, то можем взять и его шаблоны. Они находятся в папке фреймворка Django, т.е. примерно по следующему пути 'env\Lib\site-packages\django\contrib\admin\templates\registration'. Преимущество этого способа в том, что в нем есть и другие шаблоны (регистрация, восстановление пароля и т.д.).
Вы так же можете создать свой собственный шаблон, где будет типовой вывод формы.
<h3>Вход</h3>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Login</button>
</form>
<p><a href="{% url 'logout' %}">Выход</a></p>
Настройки переадресации
Успешный вход пользователя (идентификация, аутентификация, авторизация) обычно приводит к открытию какой-то страницы. Например - к открытию панели управления. По умолчанию переадресация идет на страницу "/accounts/profile/". Вы можете изменить страницу указав ее в переменной "LOGIN_REDIRECT_URL" в файле settings.py:
LOGIN_REDIRECT_URL = '/admin/'
# или ссылка на name из urls.py
LOGIN_REDIRECT_URL = 'admin'
В случае же успешного выхода, кроме завершения сессии, пользователь так же попадает на какую-то страницу. Эта страница указывается в параметрах вьюшки.
...
path('logout/', auth_views.LogoutView.as_view(next_page='/'), name='logout'),
...
Вы можете переадресовать пользователя, который зашел на страницу 'login'. По умолчанию это не происходит. Для этого заполните параметр 'redirect_authenticated_user'.
...
path('login/', auth_views.LoginView.as_view(redirect_authenticated_user=True), name='login'),
...
Использование других шаблонов
Вы можете изменить название файла и путь, который используется при поиске шаблонов для входа и выхода. Это делается так же в urls.py:
from django.contrib import admin
from django.urls import path, include
from django.contrib.auth import views as auth_views
urlpatterns = [
path('admin/', admin.site.urls),
path('login/', auth_views.LoginView.as_view('template_name': 'somepath/login.html'), name='login'),
path('logout/', auth_views.LogoutView.as_view('template_name': 'somepath/logout.html'), name='logout'),
]
...
Подписывайтесь на наш Telegram канал
Теги: #python #django #аутентификация