Поделиться через


Руководство. Проверка подлинности пользователей с помощью Django в Visual Studio

В этой статье представлен шаг 5 в серии учебников Работа с веб-платформой Django в Visual Studio.

Проверка подлинности является общим требованием для веб-приложений. Шаблон веб-проекта Django в Visual Studio предоставляет все необходимые модули для проверки подлинности в settings.py файле проекта Django. Шаг 4 в этом руководстве создает веб-приложение Django с помощью этого шаблона. На шаге 5 вы изучите возможности проверки подлинности шаблона и работаете с функциями в работающем приложении.

На шаге 5 руководства вы узнаете, как:

  • Изучение потока проверки подлинности в шаблоне веб-проекта Django в Visual Studio
  • Проверьте код, поддерживающий процесс проверки подлинности
  • Изменение кода для включения доступа к интерфейсам администратора Django
  • Запустите веб-приложение Django и используйте функции проверки подлинности

Необходимые условия

Изучение потока проверки подлинности

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

  1. В Visual Studio выберите Отладка>начать отладку (F5), чтобы запустить веб-приложение Django (DjangoWeb).

  2. Когда приложение откроется в браузере, обратите внимание на элемент Вход справа на панели навигации:

    Снимок экрана, на котором показан параметр входа на панели навигации в работающем веб-приложении Django.

    В работающем приложении Django есть панель навигации с тремя параметрами страницы: Главная, О проектеи Контакты, а также параметром входа в систему. Конфигурация проверки подлинности позволяет любому пользователю просматривать содержимое на страницах "Главная", "О" и "Контакт".

  3. Для проверки подлинности доступа к веб-приложению Django назначенный супер пользователь может использовать параметр Log in, который открывает страницу входа:

    снимок экрана, на котором показана страница аутентификации входа для суперпользователя в работающем веб-приложении Django.

  4. После входа суперпользоваем он может получить доступ к ограниченным представлениям страниц для сайта и выполнить задачи администрирования:

    снимок экрана, на котором показан один из представлений страниц, доступных супер пользователю Django, и обновленная панель навигации с параметром выхода.

  5. Суперпользователь может использовать опцию Выйти из системы для выхода из веб-приложения Django и возвращения на страницу "Главная" в качестве неаутентифицированного пользователя.

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

Проверка кода проверки подлинности

Теперь, когда вы понимаете общие функции проверки подлинности веб-приложения Django, вы готовы изучить базовый код, предоставленный шаблоном веб-проекта Django web Project:

  1. В обозревателе решенийразверните папку app/templates/app проекта. В следующих шагах рассмотрены несколько файлов в этой папке.

  2. Откройте базовый файл шаблона, layout.html. Прокрутите страницу до элемента <div class="navbar ...> и найдите тег {% include app/loginpartial.html %}.

    Тег {% include %} указывает системе шаблонов Django извлечь содержимое включенного файла на этом этапе в содержающемся шаблоне.

  3. Откройте файл 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 %}
    
  4. При запуске приложения не выполняется аутентификация суперпользователя, а код шаблона отображает только ссылку Войти. Ссылка нацелена на относительный путь входа сайта, указанный в 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 включает этот явный код при предположении, что вы, скорее всего, хотите настроить форму, например добавление проверки надежности пароля.

  5. Когда взаимодействие пользователя с приложением открывает страницу входа, приложение отрисовывает шаблон 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 %}
    
  6. Когда пользователь выбирает Войти на форме страницы, Django пытается аутентифицировать учетные данные, например, учетные данные суперпользователя:

    • Если проверка подлинности завершается ошибкой, пользователь остается на странице входа, а для тега form.errors задано значение true:

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

    • Если проверка подлинности выполнена успешно, Django открывает относительный URL-адрес в поле next, <input type="hidden" name="next" value="/" />, который в данном случае является домашней страницей (/).

  7. Когда приложение отрисовывает страницу "Главная" после проверки подлинности пользователя, свойство user.is_authenticated становится истинным при отображении шаблона loginpartial.html. В этом случае на панели навигации отображается сообщение Hello (имя пользователя), а опция 'Выйти' заменяет опцию 'Войти'.

    снимок экрана, на котором показана обновленная панель навигации для прошедшего проверку подлинности пользователя с сообщением

    Для проверки подлинности можно использовать свойство user.is_authenticated в других частях кода приложения.

Доступ к интерфейсам администратора Django

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

Суперпользователи или администраторы, в частности, могут получить доступ к встроенным интерфейсам администратора Django с помощью относительных URL-адресов сайта /admin/ и /admin/doc/. Дополнительные сведения см. в разделе Использование системы проверки подлинности Django (документация Django).

Чтобы включить доступ к интерфейсам администратора Django, выполните следующие действия.

  1. Установите пакет Python docutils в среду. Инструкции см. в разделе Установка пакетов для среды Python.

  2. В обозревателе решенийразверните папку проекта Django DjangoWeb/DjangoWeb/. Ниже описано, как обновить несколько файлов в этой папке.

  3. Откройте файл urls.py проекта Django и измените содержимое следующим образом:

    1. В верхней части файла добавьте следующий импорт пакета для URL-адресов в конец текущего списка:

      from django.conf.urls import include
      
    2. После списка импорта добавьте следующую инструкцию:

      admin.autodiscover()
      
    3. Найдите определение urlpatterns и добавьте следующую запись пути перед записью'admin/'.

      path('admin/doc/', include('django.contrib.admindocs.urls')),
      
  4. Откройте файл settings.py проекта Django и найдите коллекцию INSTALLED_APPS. Добавьте следующую запись сразу же после записи app:

    'django.contrib.admindocs',
    
  5. Остановите и перезапустите веб-приложение Django.

  6. В поле URL-адреса браузера измените представление страницы приложения на маршрут /admin/ или /admin/doc/. Эти страницы предоставляют суперпользовалю доступ к административным задачам Django, таким как создание учетных записей пользователей или групп, изменение пароля и просмотр документации по Django:

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

Изучение поведения выхода из системы

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

Выход из административного сайта Django

Если суперпользователь просматривает страницы на административном сайте Django, он может на панели навигации сайта выбрать Выйти из системы. Браузер обновляется, чтобы отобразить страницу "Выключено" для сайта:

Снимок экрана страницы выхода после того, как суперпользователь вышел из административного сайта Django.

На этой странице у пользователя есть два варианта: Главная и Войти снова. Оба параметра возвращают пользователя на страницу "Главная" для административного сайта Django (/admin), где пользователю будет предложено повторно ввести свои учетные данные.

снимок экрана, показывающий диалоговое окно входа для административного сайта Django.

Выход из веб-приложения Django

Если суперпользователь просматривает страницы в веб-приложении Django, например "О нас" или "Контакты", он может выбрать выйти из системы на панели навигации веб-приложения Django. Поведение выхода из системы минимально. Он просто завершает сеанс аутентификации и возвращает пользователя на страницу "Главная" приложения.

Вы можете переработать поведение выхода, чтобы он был более информативным для пользователя:

  1. В обозревателе решенийразверните папку приложения или шаблоны или приложения, а затем откройте файл loginpartial.html.

  2. В файле шаблона обратите внимание, что ссылка 'Выйти из системы' выполняет операцию 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'),
    

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

  3. В папке app/templates/app создайте новый HTML-файл шаблона с именем loggedoff.html.

  4. Добавьте следующее содержимое в новый файл шаблона:

    {% extends "app/layout.html" %}
    {% block content %}
    <h3>You have been logged off</h3>
    {% endblock %}
    
  5. В URL-файле проекта Django DjangoWeb/DjangoWeb/urls.pyизмените шаблон URL-адреса для пути 'logout/' следующим образом:

    path('logout/', LogoutView.as_view(template_name='app/loggedoff.html'), name='logout'),
    

    Обновленный код добавляет свойство template_name для работы с новым HTML-шаблоном для страницы "Вышел из системы".

  6. Остановите и перезапустите веб-приложение Django. Снова войдите и выберите Выйти. В этот раз приложение показывает более информативное сообщение, чтобы подтвердить, что пользователь вышел из системы.

    скриншот, демонстрирующий обновленное поведение выхода из системы для веб-приложения Django с сообщением на странице выхода.

  7. Остановите сервер и закройте окна браузера приложений.

Сохранение проекта в системе управления версиями

Если вы фиксировали решение 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.