Как я могу поднять ответ, запрещенный в Django


168

Я хотел бы сделать следующее:

raise HttpResponseForbidden()

Но я получаю ошибку:

exceptions must be old-style classes or derived from BaseException, not HttpResponseForbidden

Как мне это сделать?

Ответы:


183

Верните его из представления, как и любой другой ответ.

from django.http import HttpResponseForbidden

return HttpResponseForbidden()

30
Почему существует класс исключений, Http404но нет Http403? Почему несоответствие?
— Flimm

@Flimm stackoverflow.com/questions/3297048/… Я не уверен насчет Django, но у Django REST Framework есть: из состояния статуса импорта rest_framework 40.HTTP_403_FORBIDDEN 403
— Дэвид Уотсон

15
На самом деле использование raise PermissionDeniedимеет то преимущество, что позволяет вам показывать свой собственный вид 403
— guival

376

если вы хотите вызвать исключение, вы можете использовать:

from django.core.exceptions import PermissionDenied

def your_view(...):
    raise PermissionDenied()

Это задокументировано здесь:

https://docs.djangoproject.com/en/stable/ref/views/#the-403-http-forbidden-view

В отличие от повторного создания HttpResponseForbidden, повышение PermissionDeniedвызывает рендеринг ошибки с использованием 403.htmlшаблона, или вы можете использовать промежуточное ПО для отображения пользовательского «Запрещенного» представления.


2
Можем ли мы добавить пользовательское сообщение в PermissionDenied?
— AJ

2
Джек, да, ты можешь - сделать что-то вроде: повысить PermissionDenied («Нет пользователя, вошедшего в систему»)
— Марк Чакериан

1
Не уверен, если это имеет значение, но документы говорят throw PermissionDeniedне как вызов функции, без ()в конце.
— Фидо

2
В чем преимущество использования этого по сравнению с HttpResponseForbidden?
— Flimm

3
@Flimm: это автоматически запускает 403 на уровне промежуточного программного обеспечения, позволяя вам показывать свое собственное «Запрещенное» представление.
— Поврежденный органический

11

При желании вы можете указать пользовательский шаблон с именем «403.html» для управления отображением ошибок 403 HTTP.

Как правильно указал @ dave-halter, шаблон 403 можно использовать только если вы подняли PermissionDenied

Ниже приведен пример представления для тестирования пользовательских шаблонов «403.html», «404.html» и «500.html»; пожалуйста, убедитесь, что в настройках проекта установлено DEBUG = False, иначе вместо 404 и 500 фреймворк будет отображать трассировку.

from django.http import HttpResponse
from django.http import Http404
from django.core.exceptions import PermissionDenied


def index(request):

    html = """
<!DOCTYPE html>
<html lang="en">
  <body>
    <ul>
        <li><a href="/">home</a></li>
        <li><a href="?action=raise403">Raise Error 403</a></li>
        <li><a href="?action=raise404">Raise Error 404</a></li>
        <li><a href="?action=raise500">Raise Error 500</a></li>
    </ul>
  </body>
</html>
"""

    action = request.GET.get('action', '')
    if action == 'raise403':
        raise PermissionDenied
    elif action == 'raise404':
        raise Http404
    elif action == 'raise500':
        raise Exception('Server error')

    return HttpResponse(html)

2
Это не работает. Шаблон 403 можно использовать, только если вы подняли PermissionDenied.
— Дейв Холтер

Спасибо, Дэйв-Холтер, ты прав. Я обновил свой комментарий, чтобы исправить его.
— Марио Орланди

2

Попробуйте, отправив сообщение с ошибкой

from django.core.exceptions import PermissionDenied
raise PermissionDenied("You do not have permission to Enter Clients in Other Company, Be Careful")
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.