Share This
Связаться со мной
Крути в низ
Categories
//Django с нуля. Часть 2: регистрация, авторизация, ограничение доступа

Django с нуля. Часть 2: регистрация, авторизация, ограничение доступа

Во второй части туториала будем разрабатывать систему регистрации и авторизации, а также ограничим доступ к просмотру профилей для неавторизованных посетителей блога.

django s nulja chast 2 registracija avtorizacija ogranichenie dostupa c120533 - Django с нуля. Часть 2: регистрация, авторизация, ограничение доступа

Первая часть 🐍🚀 Django с нуля. Часть 1: пишем многопользовательский блог для клуба любителей задач Python

Второй этап разработки

Продолжим работу над проектом с создания первой учетной записи для админа, а затем перейдем к разработке необходимых моделей для базы данных и форм регистрации / авторизации. Весь код второго этапа находится здесь.

Создание учетных записей и администрирование

Панель администрирования открывается по адресу http://localhost:8000/admin. Пока что войти в админку нельзя: сначала нужно создать учетную запись суперпользователя (админа). Перед началом этого процесса следует применить миграции: python manage.py migrate (эту операцию мы намеренно пропустили на первом шаге).

После применения миграций можно приступать к созданию записи для суперпользователя: python manage.py createsuperuser

В ходе выполнения команды появится приглашение ввести имя пользователя, пароль и емейл (они не отображаются во время ввода – будьте внимательны). Учетная запись суперпользователя готова, запустите сервер и авторизуйтесь:

django s nulja chast 2 registracija avtorizacija ogranichenie dostupa 59f188f - Django с нуля. Часть 2: регистрация, авторизация, ограничение доступа

Учетная запись администратора

Кликните по ADD USER и создайте учетные записи для двух тестовых пользователей. Обратите внимание, что Джанго берет хэширование паролей на себя:

django s nulja chast 2 registracija avtorizacija ogranichenie dostupa 67b0072 - Django с нуля. Часть 2: регистрация, авторизация, ограничение доступа

Аккаунт тестового пользователя Примечание: если вы забыли пароль суперпользователя, его можно сменить так: python manage.py changepassword <имя пользователя>.

Работа с базой данных и моделями

Одна из сильнейших сторон Джанго – простота подключения базы данных и возможность работать с любыми базами с помощью одного и того же кода (и без глубоких познаний в области языка запросов SQL). Django уже создал для нас файл models.py. Каждая модель представляет отдельную таблицу в базе. Откроем models.py и напишем код для модели Post.

Для обновления структуры базы создадим и выполним миграции: сначала запустим python manage.py makemigrations, а затем python manage.py migrate.

Теперь пора обновить файл blogviews.py, в котором на первом этапе мы записали тестовый контент. Для обработки реального контента из модели Post код должен выглядеть так.

Чтобы модель для создания новых записей отображалась в панели администрирования, ее нужно зарегистрировать в файле blogadmin.py:

         from django.contrib import admin from .models import Post admin.site.register(Post)      

Теперь можно открыть админку http://localhost:8000/admin/ и создать несколько постов от разных пользователей:

django s nulja chast 2 registracija avtorizacija ogranichenie dostupa 6912d91 - Django с нуля. Часть 2: регистрация, авторизация, ограничение доступа

Записи от нескольких пользователей

Обратите внимание на формат даты – если указание часов и минут не требуется, формат можно изменить в шаблоне home.html:

         <small class="text-muted">{{ post.date_posted|date:"F d, Y" }}</small>     

Больше полезных материалов вы найдете на нашем телеграм-канале «Библиотека питониста» Интересно, перейти к каналу

Формы регистрации и авторизации

Как уже упоминалось, приложения из проекта можно использовать отдельно – вставить блог, например, в другой проект. Поэтому и систему регистрации / авторизации стоит реализовать отдельно. Запустим Джанго-команду для создания нового приложения под названием users: python manage.py startapp users. После этого нужно зарегистрировать новое приложение, как мы уже делали с блогом. Сначала откройте my_sitesettings.py и добавьте нужную строку в список INSTALLED_APPS:

         INSTALLED_APPS = [ 	'blog.apps.BlogConfig', 	'users.apps.UsersConfig', 	'crispy_forms', 	'django.contrib.admin', 	'django.contrib.auth', 	'django.contrib.contenttypes', 	'django.contrib.sessions', 	'django.contrib.messages', 	'django.contrib.staticfiles', ]      

В этом же файле в самом низу добавьте ссылку на стили Bootstrap для форм:

         CRISPY_TEMPLATE_PACK = 'bootstrap4'     

Модуль django-crispy-forms не входит в стандартный дистрибутив Джанго – скорее всего, вам потребуется его установить: pipenv install django-crispy-forms.

Затем откройте usersviews.py и сохраните в нем код:

         from django.shortcuts import render, redirect from django.contrib import messages from .forms import UserRegisterForm def register(request): 	if request.method == 'POST':     	form = UserRegisterForm(request.POST)     	if form.is_valid():         	form.save()         	username = form.cleaned_data.get('username')         	messages.success(request, f'Создан аккаунт {username}!')         	return redirect('blog-home') 	else:     	form = UserRegisterForm() 	return render(request, 'users/register.html', {'form': form})      

Для формы регистрации нам потребуется соответствующий шаблон. Как и в случае с блогом, создайте в папке users директорию templates, в ней – поддиректорию users, а в ней файл register.html. Код шаблона будет таким.

Внесем нужные изменения в url-паттерны. Откройте my_siteurls.py и добавьте в него импорт users_views и маршрут к форме регистрации:

         from django.contrib import admin from django.urls import path, include from users import views as user_views   urlpatterns = [ 	path('admin/', admin.site.urls), 	path('register/', user_views.register, name='register'), 	path('', include('blog.urls')), ]      

Теперь создайте файл usersforms.py и сохраните в нем этот код, после чего добавьте отображение сообщения об успешной регистрации в шаблон блога base.html, прямо над блоком контента {% block content %}{% endblock %}:

         {% if messages %}         	{% for message in messages %}           	<div class="alert alert-{{ message.tags }}">             	{{ message }}           	</div>         	{% endfor %} {% endif %}      

Запустим python manage.py runserver и оценим нашу форму регистрации http://localhost:8000/register/:

django s nulja chast 2 registracija avtorizacija ogranichenie dostupa ba8a397 - Django с нуля. Часть 2: регистрация, авторизация, ограничение доступа

Форма регистрации

Зарегистрируем нового пользователя NewUser и получим сообщение об успешной регистрации аккаунта. Проверим панель администрирования http://localhost:8000/admin/auth/user/ – новая учетная запись там появилась, значит, форма работает правильно. Попробуйте ввести некорректные регистрационные данные – форма проводит валидацию самостоятельно, без всяких дополнительных усилий с нашей стороны:

django s nulja chast 2 registracija avtorizacija ogranichenie dostupa 826ff1f - Django с нуля. Часть 2: регистрация, авторизация, ограничение доступа

Форма неплохо справляется с валидацией

Вход и доступ к профилям для зарегистрированных пользователей

Одно из главных преимуществ системы авторизации – возможность показывать определенный контент только зарегистрированным пользователям. Сначала мы создадим логику и страницы входа и выхода, а затем перейдем к вопросу ограничения доступа для неавторизованных и/или незарегистрированных пользователей.

Прежде всего добавим в файл my_siteurls.py импорт нужных модулей и маршруты к шаблонам страниц входа и выхода. Теперь нужно создать два шаблона в папке users. Сохраните этот код для login.html. Он генерирует такую страницу:

django s nulja chast 2 registracija avtorizacija ogranichenie dostupa 7ed05d4 - Django с нуля. Часть 2: регистрация, авторизация, ограничение доступа

Страница входа

Код для logout.html генерирует страницу выхода из учетной записи:

django s nulja chast 2 registracija avtorizacija ogranichenie dostupa 1d0147f - Django с нуля. Часть 2: регистрация, авторизация, ограничение доступа

Страница выхода

Внизу файла my_sitesettings.py добавьте:

         LOGIN_REDIRECT_URL = 'blog-home' LOGIN_URL = 'login'      

Также отредактируем код в файле usersviews.py, теперь он должен выглядеть так.

django s nulja chast 2 registracija avtorizacija ogranichenie dostupa 6e12e2d - Django с нуля. Часть 2: регистрация, авторизация, ограничение доступа

Сообщение об успешной регистрации

Чтобы управлять профилями в админ-панели, нужно зарегистрировать модель в admin.py:

         from django.contrib import admin from .models import Profile admin.site.register(Profile)      

Создайте шаблон для страницы профиля – profile.html в templates/users, и сохраните этот код в usersmodels.py. Код модели использует библиотеку для работы с изображениями Pillow. Установите ее в виртуальное окружение проекта: pipenv install pillow. Создайте и примените миграции:

         python manage.py makemigrations  python manage.py migrate      

Теперь можно запускать сервер – у нас уже есть работающие страницы http://localhost:8000/login/ и http://localhost:8000/logout/; на страницу login выполняется переадресация после регистрации. Если сейчас ввести некорректный логин, появится сообщение об ошибке. Но и ввод верных данных приведет к ошибке 404 – приложение пытается открыть профиль пользователя, но у него пока что нет правильного маршрута к странице. На самом деле, и переадресация на профиль после входа на сайт выглядит странно – гораздо логичнее перенаправить пользователя на главную страницу блога, что мы и сделаем.

Займемся переадресацией – откроем my_sitesettings.py и добавим переадресацию в конце файла:

         LOGIN_URL = 'login'     

Теперь, если вы введете верный логин и пароль, произойдет переадресация на главную страницу блога. Пока что визуально это не слишком очевидно – ссылки на панели навигации не соответствуют тому, вошел ли пользователь на сайт или нет – но мы сейчас это исправим.

Прежде всего, внесем изменения в шаблон base.html – найдите правый блок навигации и вставьте этот код между тегами <div class="navbar-nav"></div>:

                   	{% if user.is_authenticated %}             	<a class="nav-item nav-link" href="{% url 'profile' %}">Профиль</a>             	<a class="nav-item nav-link" href="{% url 'logout' %}">Выход</a>           	{% else %}             	<a class="nav-item nav-link" href="{% url 'login' %}">Вход</a>             	<a class="nav-item nav-link" href="{% url 'register' %}">Регистрация</a>           	{% endif %}     

Если зайти на сайт с правильным логином и паролем, можно увидеть свой профиль – правда, пока без аватарки:

django s nulja chast 2 registracija avtorizacija ogranichenie dostupa 8e6b8e4 - Django с нуля. Часть 2: регистрация, авторизация, ограничение доступа

Профиль без изображения пользователя

Последнее, что мы сделаем на этом этапе – обеспечим ограничение доступа к профилям для незарегистрированных пользователей. Для этого в файл usersviews.py нужно добавить декоратор @login_required:

         @login_required def profile(request): 	return render(request, 'users/profile.html')      

Если неавторизованный пользователь теперь попытается открыть страницу профиля, он будет переадресован на страницу входа на сайт. Напоминаем: весь код, созданный на этом этапе работы, находится здесь.

Промежуточные итоги

В этой части туториала мы реализовали систему авторизации в виде отдельного приложения, которое в дальнейшем можно будет использовать в любом другом Django-проекте. Дополнительной функциональностью для управления профилями мы займемся в следующей, заключительной части.

***

Материалы по теме

  • 🔩 Полный фуллстек: пишем сайт на Django, Vue и GraphQL
  • Безопасная загрузка изображений в веб-приложении на Django
  • 📊Django, Pandas и Chart.js для быстрой панели инструментов

  • 18 views
  • 0 Comment

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Свежие комментарии

    Рубрики

    About Author 01.

    blank
    Roman Spiridonov

    Моя специальность - Back-end Developer, Software Engineer Python. Мне 39 лет, я работаю в области информационных технологий более 5 лет. Опыт программирования на Python более 3 лет. На Django более 2 лет.

    Categories 05.

    © Speccy 2022 / All rights reserved

    Связаться со мной
    Close