如何阻止Django记录PermissionDenied异常?

x8diyxa7  于 2023-05-19  发布在  Go
关注(0)|答案(1)|浏览(115)

我的自定义中间件在某些情况下会引发PermissionDenied异常,向客户端返回403响应。我认为这是“正确”的做法。不幸的是,即使DEBUG设置为False,每次发生这种情况时,它也会记录异常并进行回溯。
2023-05-08 10:27:25,293警告django.request Forbidden(Permission denied):/ Traceback(最近一次调用):File“/opt/project/env/lib/python3.9/site-packages/django/core/handlers/exception.py“,line 55,in inner response = get_response(request)File“/opt/project/myapp/middleware.py“,line 112,incallraise PermissionDenied django.core.exceptions.PermissionDenied
我不在乎这些例外。有没有一个简单的方法来防止他们被记录?

qmb5sa22

qmb5sa221#

我看到了多种选择来实现您想要的:
案例A:你从来不关心django. request的回溯。

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '{name} {levelname} {asctime} {module} {process:d} {thread:d} {message}',
            'style': '{',
        },
        'custom': {
            'format': '{name} {levelname} {asctime} {module}',  # delete here what you don't want to be logged
            'style': '{',
        },
    },
    'loggers': {
        'django.request': {  # define your django.request logger here
            'handlers': ['your_handler'],  # replace as you need it
            'level': 'INFO',  # replace as you need it
            'propagate': False,  # makes that django.request logs are not being logged by django general logger
            'formatter': 'custom'  # send these logs to your setup formatter
        }
    },
}

如果它不是自我解释:在settings.py中搜索名为LOGGING的大字典。在这里,您将记录器django.request添加到您的记录器中。默认情况下,它包含在日志中,但您需要添加它,以给予更多的规范,因为您不希望看到异常。
添加django.request记录器之后,您可以将自定义格式化程序分配给它。该自定义格式化程序与详细格式化程序不同。区别是进程、线程和消息不记录!当然,你可以根据自己的需要调整它,也可以删除时间或其他什么。
请记住,这不是专门针对您的权限被拒绝错误的!然后由django.request(也是5xx)为所有日志设置。
案例B:您特别希望摆脱Permission denied错误

from django.core.exceptions import PermissionDenied
def skip_permission_denied(record):
    if record.exc_info:
        exc_type, exc_value = record.exc_info[:2]
        if isinstance(exc_value, PermissionDenied):
            return False
    return True
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '{name} {levelname} {asctime} {module} {process:d} {thread:d} {message}',
            'style': '{',
        },
    },
    'filters': {
        'filters': ['skip_permission_denied'],
            '()': 'django.utils.log.CallbackFilter',
            'callback': skip_permission_denied,
        },
    },
    'loggers': {
        'django.request': {  # define your django.request logger here
            'handlers': ['your_handler'],  # replace as you need it
            'level': 'INFO',  # replace as you need it
            'filters': ['skip_permission_denied'],  # assign this filter to logger
            'propagate': False,  # makes that django.request logs are not being logged by django general logger
        }
    },
}

定义自定义过滤器引用。这将跳过django.request logger发出的每个权限拒绝错误。
让我知道这对你的效果如何。

相关问题