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
настройках.
и, таким образом, вы не получите никаких сообщений об ошибках в консоли.
Привет!!!