Теперь необходимо предоставить пользователям возможность выхода из приложения. Мы не будем строить отдельную страницу для выхода; пользователь просто щелкает на ссылке и возвращается к домашней странице. Мы определяем схему URL для ссылки выхода, пишем функцию представления и предоставляем ссылку выхода в base.html.

<p>URL-адрес выхода</p>

Следующий код определяет схему 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.)

<p>Функция представления logout_view()</p>

Функция 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).

<p>Ссылка на представление выхода</p>

Теперь нужно создать ссылку для выхода. Мы включим ее в base.html, чтобы она была доступна на каждой странице, и включим в секцию {% if user.is_authenticated %}, чтобы ссылка была видна только пользователям, уже выполнившим вход:

base.html

...

{% if user.is_authenticated %}

Hello, {{ user.username }}.

. .log out

{% else %}

log in

{% endif %}

...

На рис. 19.5 изображена текущая домашняя страница так, как ее видит пользователь, выполнивший вход. Оформление страницы минимально, потому что сейчас нас в первую очередь интересует работа сайта. Когда необходимые функции заработают, можно переходить к стилевому оформлению сайта и приданию ему более профессионального вида.

Рис. 19.5. Домашняя страница с персональным приветствием и ссылкой для выхода

<p>Страница регистрации</p>

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

<p>URL-адрес регистрации</p>

Следующий код предоставляет шаблон URL для страницы регистрации — также в файле users/urls.py:

urls.py

...

urlpatterns = [

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

...

. .# Страница регистрации

. .url(r'^register/$', views.register, name='register'),

]

Шаблон соответствует URL http://localhost:8000/users/register/ и отправляет запросы функции register(), которую мы сейчас напишем.

<p>Функция представления register()</p>

Функция представления 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)

Перейти на страницу:

Все книги серии Библиотека программиста

Похожие книги