Руководство. Проверка подлинности пользователей с помощью Django в Visual Studio
В этой статье представлен шаг 5 в серии учебников Работа с веб-платформой Django в Visual Studio.
Проверка подлинности является общим требованием для веб-приложений. Шаблон веб-проекта Django в Visual Studio предоставляет все необходимые модули для проверки подлинности в settings.py файле проекта Django. Шаг 4 в этом руководстве создает веб-приложение Django с помощью этого шаблона. На шаге 5 вы изучите возможности проверки подлинности шаблона и работаете с функциями в работающем приложении.
На шаге 5 руководства вы узнаете, как:
- Изучение потока проверки подлинности в шаблоне веб-проекта Django в Visual Studio
- Проверьте код, поддерживающий процесс проверки подлинности
- Изменение кода для включения доступа к интерфейсам администратора Django
- Запустите веб-приложение Django и используйте функции проверки подлинности
Необходимые условия
Решение Visual Studio и веб-приложение Django на основе шаблона веб-проекта Django (DjangoWeb). Шаг 4: Используйте полный шаблон веб-проекта Django. описывает создание этого приложения.
Веб-приложение Django должно иметь учетную запись суперпользоватора (администратора). шаг 4 (создание суперпользователя Django) описывает создание учетных данных суперпользователя.
Чтобы получить подробную информацию о версиях шаблонов Django, проектах Visual Studio по сравнению с проектами Django и разработке на Python на Mac, см. раздел Предварительные требования в Шаге 1 этой серии руководств.
Изучение потока проверки подлинности
В этом разделе объясняется поток проверки подлинности по умолчанию, предоставляемый шаблоном веб-проекта Django для веб-приложения Django.
В Visual Studio выберите Отладка>начать отладку (F5), чтобы запустить веб-приложение Django (DjangoWeb).
Когда приложение откроется в браузере, обратите внимание на элемент Вход справа на панели навигации:
В работающем приложении Django есть панель навигации с тремя параметрами страницы: Главная, О проектеи Контакты, а также параметром входа в систему. Конфигурация проверки подлинности позволяет любому пользователю просматривать содержимое на страницах "Главная", "О" и "Контакт".
Для проверки подлинности доступа к веб-приложению Django назначенный супер пользователь может использовать параметр Log in, который открывает страницу входа:
После входа суперпользоваем он может получить доступ к ограниченным представлениям страниц для сайта и выполнить задачи администрирования:
Суперпользователь может использовать опцию Выйти из системы для выхода из веб-приложения Django и возвращения на страницу "Главная" в качестве неаутентифицированного пользователя.
В следующих разделах вы изменяете конфигурацию проверки подлинности для поддержки доступа к административному сайту Django для суперпользоваем.
Проверка кода проверки подлинности
Теперь, когда вы понимаете общие функции проверки подлинности веб-приложения Django, вы готовы изучить базовый код, предоставленный шаблоном веб-проекта Django web Project:
В обозревателе решенийразверните папку app/templates/app проекта. В следующих шагах рассмотрены несколько файлов в этой папке.
Откройте базовый файл шаблона, layout.html. Прокрутите страницу до элемента
<div class="navbar ...>
и найдите тег{% include app/loginpartial.html %}
.Тег
{% include %}
указывает системе шаблонов Django извлечь содержимое включенного файла на этом этапе в содержающемся шаблоне.Откройте файл loginpartial.html. Узнайте, как этот шаблон использует условный тег
{% if user.is_authenticated %}
вместе с тегом{% else %}
для отображения различных элементов пользовательского интерфейса в зависимости от того, прошел ли пользователь проверку подлинности:{% if user.is_authenticated %} <form id="logoutForm" action="/logout" method="post" class="navbar-right"> {% csrf_token %} <ul class="nav navbar-nav navbar-right"> <li><span class="navbar-brand">Hello {{ user.username }}!</span></li> <li><a href="javascript:document.getElementById('logoutForm').submit()">Log off</a></li> </ul> </form> {% else %} <ul class="nav navbar-nav navbar-right"> <li><a href="{% url 'login' %}">Log in</a></li> </ul> {% endif %}
При запуске приложения не выполняется аутентификация суперпользователя, а код шаблона отображает только ссылку Войти. Ссылка нацелена на относительный путь входа сайта, указанный в URL-файле проекта Django (DjangoWeb/DjangoWeb/urls.py), как описано в шаге 4 (проверка шаблонов маршрутов URL-адресов). Маршрут входа сопоставляется с представлением
django.contrib.auth.views.login
, а представление получает следующие данные:{ 'template_name': 'app/login.html', 'authentication_form': app.forms.BootstrapAuthenticationForm, 'extra_context': { 'title': 'Log in', 'year': datetime.now().year, } }
Этот код определяет три свойства:
template_name
определяет шаблон для страницы входа, определенной в файле приложения илиlogin.html. Помните, что эта ссылка относительна относительно сайта. Полный путь к папке — app/templates/app/login.html.extra_context
добавляет сведения в данные контекста по умолчанию, заданные шаблону. В этом случае информация содержит заголовок "Вход" вместе с датой, временем и годом.authentication_form
указывает класс формы для использования с процедурой входа. В шаблоне это значение свойства отображается как объектform
. Значение по умолчанию —AuthenticationForm
(изdjango.contrib.auth.views
), но вместо этого шаблон проекта Visual Studio использует форму, определенную в файле приложения или forms.py проекта:from django import forms from django.contrib.auth.forms import AuthenticationForm from django.utils.translation import ugettext_lazy as _ class BootstrapAuthenticationForm(AuthenticationForm): """Authentication form which uses bootstrap CSS.""" username = forms.CharField(max_length=254, widget=forms.TextInput({ 'class': 'form-control', 'placeholder': 'User name'})) password = forms.CharField(label=_("Password"), widget=forms.PasswordInput({ 'class': 'form-control', 'placeholder':'Password'}))
Класс формы является производным от
AuthenticationForm
и переопределяет поля имени пользователя и пароля для добавления текста заполнителя. Шаблон Visual Studio включает этот явный код при предположении, что вы, скорее всего, хотите настроить форму, например добавление проверки надежности пароля.
Когда взаимодействие пользователя с приложением открывает страницу входа, приложение отрисовывает шаблон login.html. Переменные
{{ form.username }}
и{{ form.password }}
отображают формыCharField
из классаBootstrapAuthenticationForm
. Существует также встроенный раздел для отображения ошибок проверки, а также готовый элемент для входа в социальные сети, если вы решили добавить эти службы:{% extends "app/layout.html" %} {% block content %} <h2>{{ title }}</h2> <div class="row"> <div class="col-md-8"> <section id="loginForm"> <form action="." method="post" class="form-horizontal"> {% csrf_token %} <h4>Use a local account to log in.</h4> <hr /> <div class="form-group"> <label for="id_username" class="col-md-2 control-label">User name</label> <div class="col-md-10"> {{ form.username }} </div> </div> <div class="form-group"> <label for="id_password" class="col-md-2 control-label">Password</label> <div class="col-md-10"> {{ form.password }} </div> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type="hidden" name="next" value="/" /> <input type="submit" value="Log in" class="btn btn-default" /> </div> </div> {% if form.errors %} <p class="validation-summary-errors">Please enter a correct user name and password.</p> {% endif %} </form> </section> </div> <div class="col-md-4"> <section id="socialLoginForm"></section> </div> </div> {% endblock %}
Когда пользователь выбирает Войти на форме страницы, Django пытается аутентифицировать учетные данные, например, учетные данные суперпользователя:
Если проверка подлинности завершается ошибкой, пользователь остается на странице входа, а для тега
form.errors
задано значение true:Если проверка подлинности выполнена успешно, Django открывает относительный URL-адрес в поле
next
,<input type="hidden" name="next" value="/" />
, который в данном случае является домашней страницей (/
).
Когда приложение отрисовывает страницу "Главная" после проверки подлинности пользователя, свойство
user.is_authenticated
становится истинным при отображении шаблона loginpartial.html. В этом случае на панели навигации отображается сообщение Hello (имя пользователя), а опция 'Выйти' заменяет опцию 'Войти'.Для проверки подлинности можно использовать свойство
user.is_authenticated
в других частях кода приложения.
Доступ к интерфейсам администратора Django
Чтобы проверить, авторизован ли прошедший проверку подлинности пользователь для доступа к определенным ресурсам, необходимо получить разрешения для конкретного пользователя из базы данных.
Суперпользователи или администраторы, в частности, могут получить доступ к встроенным интерфейсам администратора Django с помощью относительных URL-адресов сайта /admin/
и /admin/doc/
. Дополнительные сведения см. в разделе Использование системы проверки подлинности Django (документация Django).
Чтобы включить доступ к интерфейсам администратора Django, выполните следующие действия.
Установите пакет Python
docutils
в среду. Инструкции см. в разделе Установка пакетов для среды Python.В обозревателе решенийразверните папку проекта Django DjangoWeb/DjangoWeb/. Ниже описано, как обновить несколько файлов в этой папке.
Откройте файл urls.py проекта Django и измените содержимое следующим образом:
В верхней части файла добавьте следующий импорт пакета для URL-адресов в конец текущего списка:
from django.conf.urls import include
После списка импорта добавьте следующую инструкцию:
admin.autodiscover()
Найдите определение
urlpatterns
и добавьте следующую запись пути перед записью'admin/'
.path('admin/doc/', include('django.contrib.admindocs.urls')),
Откройте файл settings.py проекта Django и найдите коллекцию
INSTALLED_APPS
. Добавьте следующую запись сразу же после записиapp
:'django.contrib.admindocs',
Остановите и перезапустите веб-приложение Django.
В поле URL-адреса браузера измените представление страницы приложения на маршрут
/admin/
или/admin/doc/
. Эти страницы предоставляют суперпользовалю доступ к административным задачам Django, таким как создание учетных записей пользователей или групп, изменение пароля и просмотр документации по Django:
Изучение поведения выхода из системы
Существует два способа, которым супер пользователь может выйти из системы и завершить прошедший проверку подлинности сеанс. Веб-приложение Django включает параметр выхода из системы на панели навигации, а административный сайт Django предоставляет параметр выхода.
Выход из административного сайта Django
Если суперпользователь просматривает страницы на административном сайте Django, он может на панели навигации сайта выбрать Выйти из системы. Браузер обновляется, чтобы отобразить страницу "Выключено" для сайта:
На этой странице у пользователя есть два варианта: Главная и Войти снова. Оба параметра возвращают пользователя на страницу "Главная" для административного сайта Django (/admin), где пользователю будет предложено повторно ввести свои учетные данные.
Выход из веб-приложения Django
Если суперпользователь просматривает страницы в веб-приложении Django, например "О нас" или "Контакты", он может выбрать выйти из системы на панели навигации веб-приложения Django. Поведение выхода из системы минимально. Он просто завершает сеанс аутентификации и возвращает пользователя на страницу "Главная" приложения.
Вы можете переработать поведение выхода, чтобы он был более информативным для пользователя:
В обозревателе решенийразверните папку приложения или шаблоны или приложения, а затем откройте файл loginpartial.html.
В файле шаблона обратите внимание, что ссылка 'Выйти из системы' выполняет операцию HTTP POST (
action="/logout" method="post"
) к относительному URL-адресу сайта "/login" (href="{% url 'login' %}"
).{% if user.is_authenticated %} <form id="logoutForm" action="/logout" method="post" class="navbar-right"> {% csrf_token %} <ul class="nav navbar-nav navbar-right"> <li><span class="navbar-brand">Hello {{ user.username }}!</span></li> <li><a href="javascript:document.getElementById('logoutForm').submit()">Log off</a></li> </ul> </form> {% else %} <ul class="nav navbar-nav navbar-right"> <li><a href="{% url 'login' %}">Log in</a></li> </ul> {% endif %}
Встроенная функция представления
django.contrib.auth.views.logout
отвечает за обработку процесса выхода из системы.Текущее поведение не отображает пользовательский интерфейс, информирующий пользователя о том, что они вышли из системы. Процесс просто перенаправляет пользователя обратно на страницу веб-приложения Django "Главная" в соответствии с паттерном пути
'logout/'
, определённым в URL-файле проекта Django (DjangoWeb/DjangoWeb/urls.py).path('logout/', LogoutView.as_view(next_page='/'), name='logout'),
Чтобы отобразить более информативное подтверждение выхода, можно создать страницу "Выйти" для приложения.
В папке app/templates/app создайте новый HTML-файл шаблона с именем loggedoff.html.
Добавьте следующее содержимое в новый файл шаблона:
{% extends "app/layout.html" %} {% block content %} <h3>You have been logged off</h3> {% endblock %}
В URL-файле проекта Django DjangoWeb/DjangoWeb/urls.pyизмените шаблон URL-адреса для пути
'logout/'
следующим образом:path('logout/', LogoutView.as_view(template_name='app/loggedoff.html'), name='logout'),
Обновленный код добавляет свойство
template_name
для работы с новым HTML-шаблоном для страницы "Вышел из системы".Остановите и перезапустите веб-приложение Django. Снова войдите и выберите Выйти. В этот раз приложение показывает более информативное сообщение, чтобы подтвердить, что пользователь вышел из системы.
Остановите сервер и закройте окна браузера приложений.
Сохранение проекта в системе управления версиями
Если вы фиксировали решение Visual Studio в системе управления версиями на протяжении всей серии этого руководства, сейчас подходящее время для еще одной фиксации. Следуйте инструкциям в шаге 2 (фиксация изменений в системе контроля версий) в этом руководстве.
Решение должно соответствовать исходному коду руководства на GitHub: Microsoft/python-sample-vs-learning-django.
Использование тега {% csrf_token %} в элементах формы
Тег {% csrf_token %}
содержит встроенную защиту от межсайтовой подделки запросов (CSRF) (документация по Django). Обычно этот тег добавляется в любой элемент, который включает методы запроса POST, PUT или DELETE, такие как форма. Затем функция отрисовки шаблона (render
) вставляет необходимую защиту.
Обзор руководства
Поздравляем с завершением работы с этим руководством по Django в Visual Studio.
В этом руководстве вы узнали, как:
- Создание различных типов проектов Django с помощью различных шаблонов в Visual Studio
- Создание веб-приложения Django с несколькими страницами
- Создание различных маршрутов и представлений страниц с помощью шаблонов
- Обслуживание статических файлов, добавление страниц и использование наследования шаблонов
- Предоставление аутентифицированного доступа к ограниченным страницам и функциям приложений, а также к административным интерфейсам Django.
Связанное содержимое
- Аутентификация пользователей в Django (docs.djangoproject.com)
- исходный код учебника на GitHub (Microsoft/python-sample-vs-learning-django)