Теперь необходимо предоставить пользователям возможность выхода из приложения. Мы не будем строить отдельную страницу для выхода; пользователь просто щелкает на ссылке и возвращается к домашней странице. Мы определяем схему URL для ссылки выхода, пишем функцию представления и предоставляем ссылку выхода в base.html.
URL-адрес выхода
Следующий код определяет схему URL для выхода, соответствующую URL http://localhost:8000/users/logout/. Файл users/urls.py выглядит так:
urls.py
...
urlpatterns = [
# Страница входа
...
. .# Страница выхода
. .url(r'^logout/$', views.logout_view, name='logout'),
]
Схема URL отправляет запрос функции logout_view(), имя которой выбрано так, чтобы оно отличалось от имени функции logout(), вызываемой из представления. (Проследите за тем, чтобы изменения вносились в файл users/urls.py, а не в файл learning_log/urls.py.)
Функция представления logout_view()
Функция logout_view() тривиальна: мы просто импортируем функцию Django logout(), вызываем ее, а затем возвращаем пользователя на домашнюю страницу. Откройте файл users/views.py и введите следующий код:
views.py
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
(1) from django.contrib.auth import logout
def logout_view(request):
. ."""Завершает сеанс работы с приложением."""
(2) . .logout(request)
(3) . .return HttpResponseRedirect(reverse('learning_logs:index'))
Мы импортируем функцию logout() из django.contrib.auth (1) . В функции вызывается функция logout() (2), в аргументе которой должен передаваться объект запроса. Затем происходит возврат к домашней странице (3).
Ссылка на представление выхода
Теперь нужно создать ссылку для выхода. Мы включим ее в base.html, чтобы она была доступна на каждой странице, и включим в секцию {% if user.is_authenticated %}, чтобы ссылка была видна только пользователям, уже выполнившим вход:
base.html
...
{% if user.is_authenticated %}
Hello, {{ user.username }}.
. .log out
{% else %}
{% endif %}
...
На рис. 19.5 изображена текущая домашняя страница так, как ее видит пользователь, выполнивший вход. Оформление страницы минимально, потому что сейчас нас в первую очередь интересует работа сайта. Когда необходимые функции заработают, можно переходить к стилевому оформлению сайта и приданию ему более профессионального вида.
Рис. 19.5. Домашняя страница с персональным приветствием и ссылкой для выхода
Страница регистрации
Теперь мы построим страницу для регистрации новых пользователей. Для этой цели мы используем класс Django UserCreationForm, но напишем собственную функцию представления и шаблон.
URL-адрес регистрации
Следующий код предоставляет шаблон URL для страницы регистрации — также в файле users/urls.py:
urls.py
...
urlpatterns = [
# Страница входа
...
. .# Страница регистрации
. .url(r'^register/$', views.register, name='register'),
]
Шаблон соответствует URL http://localhost:8000/users/register/ и отправляет запросы функции register(), которую мы сейчас напишем.
Функция представления register()
Функция представления register() должна вывести пустую форму регистрации при первом запросе страницы регистрации, а затем обрабатывает заполненную форму регистрации при отправке данных. Если регистрация прошла успешно, функция также должна выполнить вход для нового пользователя. Включите следующий код в users/views.py:
views.py
from django.shortcuts import render
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from django.contrib.auth import login, logout, authenticate
from django.contrib.auth.forms import UserCreationForm
def logout_view(request):
...
def register(request):
. ."""Регистрирует нового пользователя."""
. .if request.method != 'POST':
. . . .# Display blank registration form.
(1) . . . .form = UserCreationForm()
. .else:
. . . .# Обработка заполненной формы.
(2) . . . .form = UserCreationForm(data=request.POST)
. . . .
(3) . . . .if form.is_valid():
(4) . . . . . .new_user = form.save()
. . . . . .# Выполнение входа и перенаправление на домашнюю страницу.
(5) . . . . . .authenticated_user = authenticate(username=new_user.username,
. . . . . . . .password=request.POST['password1'])
? . . . . . .login(request, authenticated_user)
? . . . . . .return HttpResponseRedirect(reverse('learning_logs:index'))
. .context = {'form': form}
. .return render(request, 'users/register.html', context)