Як отримати відповідь, заборонену в джанго


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 імпорту status.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не як виклик функції, без ()кінця.
Fydo

2
Яка перевага використовувати це над HttpResponseForbidden?
Flimm

3
@Flimm: Це автоматично запускає 403 на рівні проміжного програмного забезпечення, що дозволяє показувати власний перегляд "Заборонено".
Пошкоджені органічні

11

Ви можете додатково надати спеціальний шаблон під назвою "403.html" щоб керувати відображенням 403 помилок HTTP.

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

Нижче наведено зразок подання, який використовується для тестування користувацьких шаблонів "403.html", "404.html" та "500.html"; будь-ласка, переконайтесь, що встановлено DEBUG = Неправильно в налаштуваннях проекту, або на рамці буде показано зворотний простір замість 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.
Дейв Халтер

Дякую @ dave-halter, ти маєш рацію. Я оновив свій коментар, щоб виправити його.
Маріо Орланді

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.