Yatube — пользовательский сервис; чтобы пользователи могли управлять своими аккаунтами и публиковать посты от своего имени — нужно дать им возможность регистрироваться и авторизоваться самостоятельно.
В Django эту задачу решает встроенный модуль django.contrib.auth. Он был автоматически установлен и подключен к проекту при развёртывании Django: его можно увидеть в списке приложений в settings.py:
# yatube/settings.py
INSTALLED_APPS = [
...
'django.contrib.admin',
'django.contrib.auth', # Приложение для регистрация и авторизация пользователей
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
django.contrib.auth полностью готов для работы «из коробки»: в нём есть свой urls.py, обрабатывающий запросы, свой views.py и набор HTML-шаблонов для отображения страниц с формами и информационными сообщениями. Чтобы дать пользователям доступ к страницам приложения — достаточно подключить urls.py модуля к основному urls.py проекта.
Сделайте это: подключите к головному urls.py проекта Yatube файл urls.py модуля django.contrib.auth:
# yatube/urls.py
# Здесь импорты
...
urlpatterns = [
path('admin/', admin.site.urls),
# Все адреса с префиксом /auth
# будут прернаправлены в модуль django.contrib.auth
path('auth/', include('django.contrib.auth.urls')),
...
]
С технической точки зрения вместо префикса auth/
можно установить любой другой — и всё будет работать, однако хорошим тоном будет установить префикс, который совпадает с именем приложения, обрабатывающего URL.Теперь в проекте будут доступны новые адреса, по которым будут отображаться страницы для авторизации, смены или восстановления пароля. Увидеть их можно в файле urls.py приложения django.contrib.auth.
# В Linux/Mac
# lib/python3.8/site-packages/django/contrib/auth/urls.py
# в Windows
# Lib\site-packages\django\contrib\auth\urls.py
from django.contrib.auth import views
from django.urls import path
urlpatterns = [
# Авторизация
path('login/', views.LoginView.as_view(), name='login'),
# Выход
path('logout/', views.LogoutView.as_view(), name='logout'),
# Смена пароля
path('password_change/', views.PasswordChangeView.as_view(), name='password_change'),
# Сообщение об успешном изменении пароля
path('password_change/done/', views.PasswordChangeDoneView.as_view(), name='password_change_done'),
# Восстановление пароля
path('password_reset/', views.PasswordResetView.as_view(), name='password_reset'),
# Сообщение об отправке ссылки для восстановления пароля
path('password_reset/done/', views.PasswordResetDoneView.as_view(), name='password_reset_done'),
# Вход по ссылке для восстановления пароля
path('reset/<uidb64>/<token>/', views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
# Сообщение об успешном восстановлении пароля
path('reset/done/', views.PasswordResetCompleteView.as_view(), name='password_reset_complete'),
]
Переменные <uidb64><token>
в ссылке для восстановления пароля — это одноразовый уникальный код, ссылка, включающая этот код, отправляется на почту пользователю, если он забыл пароль и хочет восстановить доступ в аккаунт.Из соображений безопасности в приложении нет страницы для регистрации нового пользователя. При необходимости разработчик должен создать эту страницу самостоятельно.
Шаблоны для всех этих адресов уже есть в приложении, так что сразу после подключения urls.py все страницы приложения будут доступны: запустите сервер разработчика и откройте в браузере адрес http://127.0.0.1:8000/auth/logout/
Должна открыться страница выхода из аккаунта:
При проверке адресов помните, что многие из них доступны только авторизованному пользователю.
Глубинные изыскания
Файлы приложения django.contrib.auth хранятся в директории виртуального окружения: venv/lib/python3.8/site-packages/django/contrib/auth
Скопировать кодBASH└── venv
├── ... # разные папки
├── lib
│ └── python3.8 # Этой папки может не быть и версия питона может быть другой
│ └── site-packages
│ ├── ...
│ └── django
│ ├── ...
│ └── contrib
│ ├── ...
│ ├── admin
│ │ ├── ...
│ │ └── templates
│ │ ├── ...
│ │ └── registration <-- шаблоны
│ └── auth
│ ├── ...
│ ├── urls.py <-- адреса
│ └── views.py <-- вью файлы
│
└── pyvenv.cfg
Так сложилось, что файлы urls.py и views.py хранятся в директории contrib/auth/, а папка с шаблонами — в contrib/admin/templates/registration.
Классы вместо view-функций
django.contrib.auth обрабатывает запросы по знакомой схеме:urls → views → models → templates. Однако вместо view-функций в этом приложении используются Class Based View (CBV), views на основе классов. **По своему назначению Class Based View аналогичны view-функциям, но отличаются синтаксисом, а в urlspatterns
они вызываются не просто по имени, а через метод as_view()
:
urlpatterns = [
path('any-url/', ClassName.as_view()),
...
]
В таблице показана связь URL, классов и шаблонов в django.contrib.auth: