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


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.