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

137

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

raise HttpResponseForbidden()

Но я получаю сообщение об ошибке:

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

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

Теги:

4 ответа

154
Лучший ответ

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

from django.http import HttpResponseForbidden

return HttpResponseForbidden()
  • 21
    Почему существует класс исключений Http404 а не Http403 ? Почему несоответствие?
  • 0
    @Flimm stackoverflow.com/questions/3297048/… Я не уверен насчет Django, но Django REST Framework имеет: из состояния статуса импорта rest_framework.HTTP_403_FORBIDDEN 403
Показать ещё 1 комментарий
319

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

from django.core.exceptions import PermissionDenied
raise PermissionDenied

Это описано здесь:

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

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

  • 3
    Это работает только в Django> = 1,4
  • 0
    Вы все еще можете предоставить промежуточному программному обеспечению метод process_exception и визуализировать свое представление оттуда.
Показать ещё 7 комментариев
10

Вы можете по желанию предоставить настраиваемый шаблон с именем "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)
  • 1
    Это не работает. Шаблон 403 можно использовать только в том случае, если вы подняли PermissionDenied.
  • 0
    Спасибо, Дэйв-Холтер, ты прав. Я обновил свой комментарий, чтобы исправить это.
0

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

from django.core.exceptions import PermissionDenied
raise PermissionDenied("You do not have permission to Enter Clients in Other Company, Be Careful")

Ещё вопросы

Сообщество Overcoder
Наверх
Меню