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

168

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

raise HttpResponseForbidden()

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

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

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

ocoutts
источник

Ответы:

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")
Саад Мирза
источник