如何阻止Django记录自定义中间件抛出的PermissionDenied异常?
解决Django中PermissionDenied异常被记录的问题
有两种简便方法可以阻止这类日志记录,根据你的场景选择:
方法一:直接返回403响应(推荐)
既然你的目标是向客户端返回403,完全可以不抛出PermissionDenied异常,直接返回HttpResponseForbidden响应。这样Django的异常处理流程不会被触发,自然不会生成相关日志。
修改中间件代码:
from django.http import HttpResponseForbidden # 替换原来的 raise PermissionDenied 代码 return HttpResponseForbidden()
这个方法最直接,不需要改动任何日志配置,符合你主动返回403的业务逻辑。
方法二:通过日志过滤器屏蔽特定日志
如果你必须保留抛出异常的逻辑,可以自定义日志过滤器,过滤掉django.request中关于PermissionDenied的警告日志。
- 在你的项目中创建一个日志过滤器类(比如放在
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())
- 在
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
相关产品推荐
相关产品推荐

