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



Pdf көрінісі
бет261/266
Дата03.03.2023
өлшемі7,86 Mb.
#170986
түріКнига
1   ...   258   259   260   261   262   263   264   265   266
Байланысты:
Изучаем Python. Программирование игр, визуализация данных, веб-приложения ( PDFDrive )


Глава 19 • Учетные записи пользователей
использовать идентификатор любого из созданных пользователей; он не обязан 
быть суперпользователем. Django проводит миграцию базы данных, используя это 
значение, и создает файл миграции 
0003_topic_owner .py
, добавляющий поле 
owner
в модель 
Topic
.
Теперь можно провести миграцию. Введите следующую команду в активной вир-
туальной среде:
(venv)learning_log$ 
python manage.py migrate
Operations to perform:
Synchronize unmigrated apps: messages, staticfiles
Apply all migrations: learning_logs, contenttypes, sessions, admin, auth
...
Running migrations:
Rendering model states... DONE
 
Applying learning_logs.0003_topic_owner... 
OK
(venv)learning_log$
Django применяет новую миграцию с результатом 
OK

. Чтобы убедиться в том, что 
миграция сработала так, как и ожидалось, можно воспользоваться интерактивной 
оболочкой:

>>> 
from learning_logs.models import Topic
 
>>> 
for topic in Topic.objects.all():
...
print(topic, topic.owner)
... 
Chess ll_admin 
Rock Climbing ll_admin 
>>>
После импортирования 
Topic
из 
learning_logs.models

мы перебираем все су-
ществующие темы, выводим каждую тему и имя пользователя, которому она при-
надлежит 

. Как видите, сейчас каждая тема принадлежит пользователю 
ll_admin
.
ПРИМЕЧАНИЕ
Вместо миграции можно просто сбросить содержимое базы данных, но это приведет к потере всех 
существующих данных . Полезно научиться выполнять миграцию базы данных без нарушения це-
лостности данных пользователей . Если вы хотите начать с новой базы данных, используйте ко-
манду python manage .py flush для повторного построения структуры базы данных . Вам придется 
создать нового суперпользователя, а все данные будут потеряны .
Ограничение доступа к темам
В настоящее время пользователь, выполнивший вход, будет видеть все темы не-
зависимо от того, под какой учетной записью он вошел. Сейчас мы изменим при-
ложение, чтобы каждый пользователь видел только принадлежащие ему темы.
Внесите следующее изменение в функцию 
topics()
в файле 
views .py
:
views.py
...
@login_required


Редактирование данных
433
def topics(request):
"""Выводит список тем."""
topics = Topic.objects.filter(owner=request.user).order_by('date_added')
context = {'topics': topics}
return render(request, 'learning_logs/topics.html', context)
...
Если пользователь выполнил вход, в объекте запроса устанавливается атрибут 
request.user
с информацией о пользователе. Фрагмент кода 
Topic.objects.
filter(owner=request.user)
приказывает Django извлечь из базы данных только 
те объекты 
Topic
, у которых атрибут 
owner
соответствует текущему пользователю. 
Так как способ отображения не изменяется, изменять шаблон для страницы тем 
вообще не нужно.
Чтобы увидеть, как работает этот способ, выполните вход в качестве пользователя, 
с которым связаны все существующие темы, и перейдите к странице со списком 
тем. На ней должны отображаться все темы. Теперь завершите сеанс и войдите 
снова с другой учетной записью. На этот раз страница должна быть пустой.
Защита тем пользователя
Никаких реальных ограничений на доступ к страницам еще не существует, по-
этому любой зарегистрированный пользователь может опробовать разные URL 
(например, 
http://localhost:8000/topics/1/
) и просмотреть страницы тем, которые 
ему удастся подобрать.
Попробуйте сделать это. После входа с учетной записью суперпользователя ско-
пируйте URL или запишите идентификатор в URL темы, после чего завершите 
сеанс и войдите снова от имени другого пользователя. Введите URL этой темы. 
Вам удастся прочитать все записи, хотя сейчас вы вошли под именем другого 
пользователя.
Чтобы решить эту проблему, мы будем выполнять проверку перед получением 
запрошенных данных в функции представления 
topic()
:
views.py
from django.shortcuts import render
 
from django.http import HttpResponseRedirect, Http404
from django.core.urlresolvers import reverse
...
@login_required
def topic(request, topic_id):
"""Выводит одну тему и все ее записи."""
topic = Topic.objects.get(id=topic_id)
# Проверка того, что тема принадлежит текущему пользователю.
 
if topic.owner != request.user:
raise Http404
entries = topic.entry_set.order_by('-date_added')
context = {'topic': topic, 'entries': entries}
return render(request, 'learning_logs/topic.html', context)
...


434

Достарыңызбен бөлісу:
1   ...   258   259   260   261   262   263   264   265   266




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

    Басты бет