428
Глава 19 • Учетные записи пользователей
Редактирование
данных
Пользователь должен иметь возможность вводить данные, принадлежащие только
ему лично. Мы создадим систему, которая будет определять, какому пользователю
принадлежат те или иные данные, и ограничивать доступ к страницам, чтобы поль-
зователь мог работать только с принадлежащими ему данными.
В этом разделе мы изменим модель
Topic
, чтобы каждая тема принадлежала кон-
кретному пользователю. При этом также автоматически решается проблема с запи-
сями, так как каждая запись принадлежит конкретной теме. Начнем с ограничения
доступа к страницам.
Ограничение доступа с использованием @login_required
Django позволяет легко ограничить доступ к определенным страницам для поль-
зователей, выполнивших вход, с помощью декоратора
@login_required
.
Декоратор
(decorator) представляет собой директиву, размещенную непосредственно перед
определением функции, применяемую к функции перед ее выполнением и влия-
ющую на поведение кода. Рассмотрим пример.
Ограничение доступа к страницам тем
Каждая тема будет принадлежать пользователю, поэтому только зарегистриро-
ванные пользователи смогут запрашивать страницы тем. Добавьте следующий код
в
learning_logs/views .py
:
views.py
...
from django.core.urlresolvers
import reverse
from django.contrib.auth.decorators import login_required
from .models import Topic, Entry
...
@login_required
def topics(request):
"""Выводит все темы."""
...
Сначала импортируется функция
login_required()
. Мы применяем
login_
required()
как декоратор для функции представления
topics()
, для чего перед
именем
login_required()
ставится знак
@
; он сообщает Python, что этот код должен
выполняться
перед кодом
topics()
.
Код
login_required()
проверяет, выполнил ли пользователь вход, и Django вы-
полняет код
topics()
только при выполнении этого условия. Если же пользователь
не выполнил вход, он перенаправляется на страницу входа.
Чтобы перенаправление работало, необходимо внести изменения
settings .py
и со-
общить Django, где искать страницу входа. Добавьте следующий фрагмент в самый
конец
settings .py
:
Редактирование данных
429
settings.py
"""
Django settings for learning_log
project
...
# Мои настройки
LOGIN_URL = '/users/login/'
Когда пользователь, не прошедший проверку, запрашивает страницу, защищенную
декоратором
@login_required
, Django отправляет пользователя на URL-адрес,
определяемый
LOGIN_URL
в
settings .py
.
Чтобы протестировать эту возможность, завершите сеанс в любой из своих учетных
записей и вернитесь на домашнюю страницу. Щелкните на ссылке
Topics
, которая
должна направить вас на страницу входа. Выполните вход с любой из своих учет-
ных записей, на домашней странице снова щелкните на ссылке
Topics
. На этот раз
вы получите доступ к странице со списком тем.
Ограничение
доступа в Learning Log
Django упрощает ограничение доступа к страницам, но вы должны решить, какие
страницы следует защищать. Лучше сначала подумать,
к каким страницам можно
разрешить неограниченный доступ, а затем ограничить его для всех остальных
страниц. Снять излишние ограничения несложно, причем это куда менее риско-
ванно, чем оставлять действительно важные страницы без ограничения доступа.
В приложении Learning Log мы оставим неограниченный доступ к домашней
странице, странице регистрации и выхода. Доступ ко всем остальным страницам
будет ограничен.
Вот как выглядит файл
learning_logs/views .py
с декораторами
@login_required
, при-
мененными к каждому представлению, кроме
index()
:
views.py
...
@login_required
def topics(request):
...
@login_required
def topic(request, topic_id):
...
@login_required
def new_topic(request):
...
@login_required
def new_entry(request, topic_id):
...
@login_required
def edit_entry(request, entry_id):
...