Класс HttpResponseForbidden
Класс HttpResponseForbidden наследуется от HttpResponse
и предназначен для формирования HTTP-ответа с кодом состояния
403. Этот код указывает, что сервер понял запрос, но отказывается
его выполнять из-за недостатка прав у пользователя. В отличие
от ошибки 401, которая требует аутентификации, ошибка 403
означает, что аутентификация не поможет - доступ запрещен
на уровне прав доступа.
Класс принимает те же параметры, что и базовый HttpResponse:
содержимое ответа (строку), параметры заголовков и другие
аргументы. При этом код состояния автоматически устанавливается
в 403, а причинно-следственная фраза устанавливается
в "Forbidden".
Синтаксис
HttpResponseForbidden(content='', *args, **kwargs)
Параметры конструктора:
-
content- строковое содержимое ответа (может быть пустым) -
*argsи**kwargs- дополнительные аргументы, передаваемые в базовый классHttpResponse
Пример . Использование в представлении
В этом примере проверяется наличие у пользователя роли "admin" и возвращается ответ с кодом 403 при отсутствии прав:
from django.http import HttpResponseForbidden
from django.shortcuts import render
def admin_panel(request):
if not request.user.is_authenticated:
return HttpResponseForbidden("Authentication required")
if not request.user.is_superuser:
return HttpResponseForbidden("You do not have admin rights")
return render(request, 'admin_panel.html')
Результат выполнения при попытке доступа неавторизованного пользователя:
"Authentication required"
Пример . С обработкой ошибок в классе-представлении
Рассмотрим использование HttpResponseForbidden
в классе-представлении для контроля доступа к объектам:
from django.http import HttpResponseForbidden
from django.views import View
from myapp.models import Document
class DocumentEditView(View):
def get(self, request, doc_id):
try:
doc = Document.objects.get(id=doc_id)
except Document.DoesNotExist:
return HttpResponseForbidden("Document not found")
if doc.owner != request.user:
return HttpResponseForbidden("You are not the owner of this document")
return render(request, 'edit_document.html', {'doc': doc})
Пример . С использованием декоратора и JSON-ответа
Можно возвращать HttpResponseForbidden
с JSON-данными для API-эндпоинтов:
import json
from django.http import HttpResponseForbidden
from django.views.decorators.http import require_http_methods
@require_http_methods(['POST'])
def api_delete_user(request, user_id):
if not request.user.is_staff:
data = json.dumps({
'error': 'Forbidden',
'message': 'Staff privileges required'
})
return HttpResponseForbidden(data, content_type='application/json')
# Deletion logic here
return JsonResponse({'success': True})
Пример . Настройка кастомной страницы 403
Можно передать в ответ HTML-содержимое для отображения кастомной страницы ошибки:
from django.http import HttpResponseForbidden
from django.template import loader
def restricted_section(request):
if not request.user.is_authenticated:
template = loader.get_template('errors/403.html')
context = {'error_message': 'Please log in first'}
return HttpResponseForbidden(template.render(context, request))
return render(request, 'restricted.html')
Смотрите также
-
класс
HttpResponseNotFound,
который возвращает ответ с кодом ошибки 404 -
класс
HttpResponseBadRequest,
который возвращает ответ с кодом ошибки 400 -
класс
HttpResponseNotAllowed,
который возвращает ответ с кодом ошибки 405 -
класс
HttpResponseServerError,
который возвращает ответ с кодом ошибки 500