You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止Django记录自定义中间件抛出的PermissionDenied异常?

解决Django中PermissionDenied异常被记录的问题

有两种简便方法可以阻止这类日志记录,根据你的场景选择:

方法一:直接返回403响应(推荐)

既然你的目标是向客户端返回403,完全可以不抛出PermissionDenied异常,直接返回HttpResponseForbidden响应。这样Django的异常处理流程不会被触发,自然不会生成相关日志。

修改中间件代码:

from django.http import HttpResponseForbidden

# 替换原来的 raise PermissionDenied 代码
return HttpResponseForbidden()

这个方法最直接,不需要改动任何日志配置,符合你主动返回403的业务逻辑。

方法二:通过日志过滤器屏蔽特定日志

如果你必须保留抛出异常的逻辑,可以自定义日志过滤器,过滤掉django.request中关于PermissionDenied的警告日志。

  1. 在你的项目中创建一个日志过滤器类(比如放在myapp/utils.py):
from django.core.exceptions import PermissionDenied

class IgnorePermissionDeniedFilter:
    def filter(self, record):
        # 过滤掉包含"Permission denied"的WARNING级别日志
        return not (record.levelname == 'WARNING' and 'Permission denied' in record.getMessage())
  1. 在settings.py的LOGGING配置中添加这个过滤器,并应用到对应的handler上:
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'ignore_permission_denied': {
            '()': 'myapp.utils.IgnorePermissionDeniedFilter',
        },
    },
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'filters': ['ignore_permission_denied'],  # 应用过滤器
        },
        # 如果使用了文件日志handler,同样需要添加这个filter
        'file': {
            'class': 'logging.FileHandler',
            'filename': 'django.log',
            'filters': ['ignore_permission_denied'],
        },
    },
    'loggers': {
        'django.request': {
            'handlers': ['console', 'file'],
            'level': 'WARNING',
            'propagate': False,
        },
    },
}

这样配置后,django.request日志器就不会再记录PermissionDenied相关的警告和回溯信息了。

内容的提问来源于stack exchange,提问作者captain_grossbeard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 08:40:06