Представления log in и log out

Отредактируйте файл urls.py приложения account:

from django.conf.urls import url
from . import views

urlpatterns = [
    # previous login view
    # url(r'^login/$', views.user_login, name='login'),

    # login / logout urls
    url(r'^login/$', 'django.contrib.auth.views.login', name='login'),
    url(r'^logout/$', 'django.contrib.auth.views.logout', name='logout'),
    url(r'^logout-then-login/$', 'django.contrib.auth.views.logout_then_login', name='logout_then_login'),
]

Мы заккоментировали шаблон URL-адреса для представления user_login, созданного ранее для использования представления login Джанго.

Создайте новый каталог в каталоге шаблонов приложения account и назовите его registration. Создайте новый файл в новом каталоге, назовите его login.html и добавьте в него следующий код:

{% extends "base.html" %}
{% block title %}Log-in{% endblock %}
{% block content %}
    <h1>Log-in</h1>
    {% if form.errors %}
        <p>
            Your username and password didn't match.
            Please try again.
        </p>
    {% else %}
        <p>Please, use the following form to log-in:</p>
    {% endif %}
    <div class="login-form">
        <form action="{% url 'login' %}" method="post">
            {{ form.as_p }}
            {% csrf_token %}
            <input type="hidden" name="next" value="{{ next }}"/>
            <p><input type="submit" value="Log-in"></p>
        </form>
    </div>
{% endblock %}

Этот шаблон для входа очень похож на созданный ранее. Джанго использует AuthenticationForm, расположенную в django.contrib.auth.forms. Эта форма пытается проверить подлинность пользователя и порождает ошибку проверки, если имя пользователя было не верно. В этом случае мы можем искать ошибки с помощью команды{% if form.errors %} . Обратите внимание, что мы добавили скрытый элемент <input> для отправки значения переменной с именем next.

Параметр next должен быть URL-адресом. Если этот параметр указан, то после входа пользователя в систему он перенаправляется на заданный URL-адрес.

Теперь создайте шаблон logged_out.html внутри каталога шаблона registration и вставьте в него следующий код:

{% extends "base.html" %}
{% block title %}Logged out{% endblock %}
{% block content %}
    <h1>Logged out</h1>
    <p>You have been successfully logged out. You can <a href="{% url "login" %}">log-in again</a>.</p>
{% endblock %}

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

После добавления шаблонов URL-адресов и шаблонов для входных и выходных представлений сайт готов к входу в систему с использованием представлений аутентификации Джанго.

Обратите внимание, что представление logout_then_login, включенное в наш urlconf, не нуждается в шаблоне, поскольку он выполняет перенаправление на log in view.

Теперь создадим новый view для отображения панели мониторинга для пользователя, чтобы знать когда пользователь войдет в свою учетную запись. Откройте файл views.py приложения account и добавьте в него следующий код:

from django.contrib.auth.decorators import login_required

@login_required
def dashboard(request):
    return render(request, 'account/dashboard.html', {'section': 'dashboard'})

Мы добавляем в наше представление декоратор login_required authentication framework. Декоратор login_required проверяет, прошел ли текущий пользователь аутентификацию. Если пользователь прошел аутентификацию, рпедставление выполнится; Если пользователь не прошел аутентификацию, он будет перенаправлян на страницу входа.

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

Теперь необходимо создать шаблон для представления панели мониторинга. Создайте новый файл внутри шаблонов/учетной templates/account/ и назовите его dashboard.html :

{% extends "base.html" %}

{% block title %}Dashboard{% endblock %}

{% block content %}
    <h1>Dashboard</h1>
    <p>Welcome to your dashboard.</p>
{% endblock %}

Затем добавьте следующий шаблон URL-адреса для этого измените файл urls.py приложения account:

urlpatterns = [
    # ...
    url(r'^$', views.dashboard, name='dashboard'),
]

Теперь отредактируйте файл settings.py:

from django.core.urlresolvers import reverse_lazy

LOGIN_REDIRECT_URL = reverse_lazy('dashboard')
LOGIN_URL = reverse_lazy('login')
LOGOUT_URL = reverse_lazy('logout')

Что за настройки мы добавили:

  • LOGIN_REDIRECT_URL : Сообщает о том, на какой URL-адрес перенаправлять пользователя после входа в систему.
  • LOGIN_URL : URL-адрес для перенаправления пользователя на вход (например, с помощью декоратора login_required)
  • LOGOUT_URL : URL-адрес для перенаправления пользователя на выход

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

Для этого необходимо определить, вошел ли текущий пользователь в систему или нет, чтобы отобразить соответствующую текущему состоянию пользователя, ссылку. Текущий пользователь задается в HttpRequest объекте промежуточного класса authentication. Доступ к нему можно получить с помощью request.user. В запросе будет найден объект user, даже если user не прошел аутентификацию. Неаутентифицированный пользователь, задается в запросе в качестве экземпляра AnonymousUser. Наилучший способ проверки состояния аутентификаци текущего пользователя — вызов request.user.is_authenticated()

Отредактируйте в шаблоне base.html<div>с ID header:

<div id="header">
    <span class="logo">Bookmarks</span>
    {% if request.user.is_authenticated %}
        <ul class="menu">
            <li {% if section=="dashboard" %}class="selected"{% endif %}>
            <a href="{% url " dashboard" %}">My dashboard</a>
            </li>
            <li {% if section=="images" %}class="selected"{% endif %}>
            <a href="#">Images</a>
            </li>
            <li {% if section=="people" %}class="selected"{% endif %}>
                <a href="#">People</a>
            </li>
        </ul>
    {% endif %}
    <span class="user">
        {% if request.user.is_authenticated %}
            Hello {{ request.user.first_name }},
            <a href="{% url "logout" %}">Logout</a>
        {% else %}
            <a href="{% url "login" %}">Log-in</a>
        {% endif %}
    </span>
</div>

Как можно видеть, меню сайта отображается только для пользователей, прошедших аутентификации. Мы также проверяем текущий раздел, чтобы добавить выбранный атрибут класса к соответствующему элементу <li>, чтобы выделить текущий раздел в меню с помощью CSS. Также отображается имя пользователя и ссылка для выхода в систему, если пользователь прошел аутентификацию, или ссылка для входа в систему.

Откройте в браузере http://127.0.0.1:8000/account/login/ . Вы должны увидеть стриницу входа. Введите валидный логин и пароль. Вы увидите следующее:

Можно увидеть, что раздел My dashboard выделен с помощью CSS, так как он имеет class selected. Поскольку пользователь прошел аутентификацию, имя пользователя отображается в правой части header-а. Щелкните ссылку Logout. Вы увидите следующую страницу:

На этой странице можно увидеть, что пользователь вышел из системы, и поэтому больше не отображается меню веб-сайта. Ссылка в правой стороне хедера показывает теперь Log-in.

Если вы видите страницу log out из сайта администрирования Джанго, а не собственную страницу выхода из системы, проверьте настройки INSTALLED_APPS и убедитесь, что django.contrib.admin находится после account. Оба шаблона находятся в том же относительном пути, и загрузчик шаблона Джанго будет использовать первый найденный.

results matching ""

    No results matching ""