Класс HttpResponseForbidden

Класс HttpResponseForbidden наследуется от HttpResponse и предназначен для формирования HTTP-ответа с кодом состояния 403. Этот код указывает, что сервер понял запрос, но отказывается его выполнять из-за недостатка прав у пользователя. В отличие от ошибки 401, которая требует аутентификации, ошибка 403 означает, что аутентификация не поможет - доступ запрещен на уровне прав доступа.

Класс принимает те же параметры, что и базовый HttpResponse: содержимое ответа (строку), параметры заголовков и другие аргументы. При этом код состояния автоматически устанавливается в 403, а причинно-следственная фраза устанавливается в "Forbidden".

Синтаксис

pythonHttpResponseForbidden(content='', *args, **kwargs)

Параметры конструктора:

Пример . Использование в представлении

В этом примере проверяется наличие у пользователя роли "admin" и возвращается ответ с кодом 403 при отсутствии прав:

pythonfrom 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')

Результат выполнения при попытке доступа неавторизованного пользователя:

python"Authentication required"

Пример . С обработкой ошибок в классе-представлении

Рассмотрим использование HttpResponseForbidden в классе-представлении для контроля доступа к объектам:

pythonfrom 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-эндпоинтов:

pythonimport 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-содержимое для отображения кастомной страницы ошибки:

pythonfrom 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