Приложение django.contrib.auth

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:



Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: