Книга «Изучаем Python»



Pdf көрінісі
бет234/238
Дата07.01.2022
өлшемі7,86 Mb.
#18670
түріКнига
1   ...   230   231   232   233   234   235   236   237   238
УПРАЖНЕНИЯ

19-2 . Учетные записи в блоге: добавьте систему аутентификации и регистрации в проект 

Blog, работа над которым началась в упражнении 19-1 (с . 419) . Проследите за тем, чтобы 

пользователь, выполнивший вход, видел свое имя где-то на экране, а незарегистрирован-

ные пользователи видели ссылку на страницу регистрации .



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()


:



Достарыңызбен бөлісу:
1   ...   230   231   232   233   234   235   236   237   238




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет