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



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


Глава 19 • Учетные записи пользователей
Код 404 — стандартное сообщение об ошибке, которое возвращается в тех случаях, 
когда запрошенный ресурс не существует на сервере. В данном случае мы импор-
тируем исключение 
Http404

, которое будет выдаваться программой при запросе 
пользователем темы, которую ему видеть не положено. Получив запрос темы, перед 
отображением страницы мы убеждаемся в том, что пользователь этой темы является 
текущим пользователем приложения. Если тема не принадлежит текущему пользова-
телю, выдается исключение 
Http404

, а Django возвращает страницу с ошибкой 404.
Пока при попытке просмотреть записи другого пользователя вы получите от Django 
сообщение «Страница не найдена». В главе 20 проект будет настроен так, чтобы 
пользователь видел полноценную страницу ошибки.
Защита страницы edit_entry
Страницы 
edit_entry
используют URL-адреса в форме 
http://localhost:8000/edit_
entry/entry_id/
, где 
entry_id
— число. Защитим эту страницу, чтобы никто не мог 
подобрать URL для получения доступа к чужим записям:
views.py
...
@login_required
def edit_entry(request, entry_id):
"""Редактирует существующую запись."""
entry = Entry.objects.get(id=entry_id)
topic = entry.topic
if topic.owner != request.user:
raise Http404
if request.method != 'POST':
# Исходный запрос; форма заполняется данными текущей записи.
...
Программа читает запись и тему, связанную с этой записью. Затем мы проверяем, 
совпадает ли владелец темы с текущим пользователем; при несовпадении выдается 
исключение 
Http404
.
Связывание новых тем с текущим пользователем
В настоящее время страница добавления новых тем несовершенна, потому что она 
не связывает новые темы с конкретным пользователем. При попытке добавить 
новую тему выдается сообщение об ошибке 
IntegrityError
с уточнением 
learning_
logs_topic.user_id
may
not
be
NULL
. Django говорит, что при создании новой темы 
обязательно должно быть задано значение поля 
owner
.
Проблема легко решается, потому что мы можем получить доступ к информации 
текущего пользователя через объект 
request
. Добавьте следующий код, связыва-
ющий новую тему с текущим пользователем:
views.py
...


Итоги
435
@login_required
def new_topic(request):
"""Определяет новую тему."""
if request.method != 'POST':
# Данные не отправлялись; создается пустая форма.
form = TopicForm()
else:
# Отправлены данные POST; обработать данные.
form = TopicForm(request.POST)
if form.is_valid():
 
new_topic = form.save(commit=False)
 
new_topic.owner = request.user
 
new_topic.save()
return HttpResponseRedirect(reverse('learning_logs:topics'))
context = {'form': form}
return render(request, 'learning_logs/new_topic.html', context)
...
При первом вызове 
form.save()
передается аргумент 
commit=False
, потому что 
новая тема должна быть изменена перед сохранением в базе данных 

. Атрибуту 
owner
новой темы присваивается текущий пользователь 

. Наконец, мы вызываем 
save()
для только что определенного экземпляра темы 

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


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




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

    Басты бет