Django выводит ошибку при возникновении исключения PermissionDenied

В нашем проекте мы использовали django SessionMiddleware для обработки сессий пользователей, и он работает нормально. Единственная проблема заключается в том, что когда происходит исключение PermissionDenied, ошибка и ее трассировка будут выведены в консоль! Однако, как и ожидалось, при возникновении этого исключения пользователю будет показана страница 403, но я думаю, что это не кажется рациональным, потому что промежуточное ПО здесь обрабатывает исключение! Так же как и исключение not found, я не ожидаю никакой ошибки в консоли. Может, что-то не так?!

вот настройки промежуточного программного обеспечения:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django_otp.middleware.OTPMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'axes.middleware.AxesMiddleware',
]

А вот распечатанная ошибка:

Forbidden (Permission denied): /the/not_allowed/page
Traceback (most recent call last):
  File "/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/usr/lib/python3.8/contextlib.py", line 75, in inner
    return func(*args, **kwds)
  File "/our_project/base/decorators.py", line 88, in wrapper
    return view_func(request, *args, **kwargs)
  File "/venv/lib/python3.8/site-packages/django/contrib/auth/decorators.py", line 21, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "/venv/lib/python3.8/site-packages/django/contrib/auth/decorators.py", line 20, in _wrapped_view
    if test_func(request.user):
  File "/venv/lib/python3.8/site-packages/django/contrib/auth/decorators.py", line 70, in check_perms
    raise PermissionDenied
django.core.exceptions.PermissionDenied

Из этого комментария

В данном примере исключение возникает из permission_required. декоратора в django.contrib.auth.decorators. Я передал raise_exception=True в этот декоратор, чтобы заставить его поднять исключение вместо перенаправления на страницу входа

.

Итак, ясно, что вы установили raise_exception=True в вашем декораторе.

и из doc

Если задан параметр raise_exception, декоратор поднимет PermissionDenied, предлагая представление 403 (HTTP Forbidden) вместо перенаправления на страницу входа.

Итак, технически, когда условия не выполняются, Django вызовет исключение. Но, в зависимости от значения 403.html, Django покажет вам либо простую 403 страницу, либо заказной HTML ответ.


Я не ожидаю ошибки в консоли. Что-то не так?

Здесь нет ничего плохого (или я ничего не увидел).

Так что, если вы хотите исключить обратную трассировку из консоли, вам, возможно, придется написать промежуточное ПО для обработки ошибок для обработки этого исключения.

# error handling middleware
from django.core.exceptions import PermissionDenied
from django.shortcuts import render


class PermissionDeniedErrorHandler:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)
        return response

    def process_exception(self, request, exception):
        # This is the method that responsible for the safe-exception handling
        if isinstance(exception, PermissionDenied):
            return render(
                request=request,
                template_name="your_custom_403.html",
                status=403
            )
        return None

Примечание: Не забудьте связать это промежуточное ПО в ваших MIDDLEWARE настройках.

и, таким образом, вы не получите никаких сообщений об ошибках в консоли.

Привет!!!

Вернуться на верх