- 异常处理基本原则
在编写Django程序时,错误和异常很难避免。因此,我们需要对这些异常进行处理,以使程序的可靠程度更高。在处理异常时,原则如下:
- 新的异常比旧的异常更好
- 不应该忽略错误/异常,应该始终要处理的
-
如果您不知道如何处理异常,请不要忽略它们,而是交给Django或者Python本身的默认处理方式
-
Django中的异常处理方式
-
Django针对HTTP请求的错误有一种独特的错误处理方式,即将HTTP请求错误显示在单独的页面上,并使用debug工具栏显示调试信息。在生产环境中,这种方式不太友好,可能会对用户有隐藏的威胁。
-
Django作为Web框架,提供了一种全局异常处理机制。可以自定义一个中间件,用于捕获所有异常,并将它们记录在日志中或显示在控制台上,或者在生产环境中向特定的邮箱发送一封警报邮件。
以下是一个完整的如何在Django中全局捕获异常并记录的示例:
import logging
class ExceptionMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
try:
response = self.get_response(request)
except Exception as e:
logging.exception(e)
response = None
return response
在这个中间件中,我们捕获了所有异常并记录在了日志文件中,如果需要在生产环境中,我们也可以配置为发送邮件,使用Django自带的邮件服务器。在这里,建议在日志配置中调整日志记录的级别,以避免一些不必要的警报。这可以在settings.py
中配置:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
# 配置处理器
'console': {
'class': 'logging.StreamHandler',
},
'log_file': { # 日志文件处理器
'class': 'logging.handlers.RotatingFileHandler',
'filename': 'django.error.log',
'maxBytes': 1024 * 1024,
'backupCount': 5,
'encoding': 'utf8',
},
},
'loggers': {
# django 内置的警告和错误
'django': {
'handlers': ['console', 'log_file'],
'level': 'ERROR',
},
# 其它应用程序可以写入这个日志,请根据需要进行调整
'': { # 空字符串,是所有的日志类别
'handlers': ['console', 'log_file'],
'level': 'ERROR',
},
},
}
可以看到,我们对django
内置警告和错误(level=ERROR
)进行了记录,同时也记录了其他应用的警告和错误,以示例的方式展现在这里,可以根据自己的实际情况进行调整。
- 另一个示例:处理它无法找到的
404
错误
Django中的错误有很多种,其中最常见的时404
错误。为此,我们也可以编写处理器来针对404
错误进行处理:
from django.shortcuts import render
from django.http import HttpResponseNotFound
def handler404(request, exception=None):
return render(request, template_name='commons/404.html', status=404)
在urls.py
中添加此接口的路由即可。它的工作是接收一个请求,并将其映射到自己的404页面。
总结:
在Django中,全局异常可以通过编写自己的中间件来实现。这样,在发生异常时,自定义的中间件可以向日志中记录概要或完整的异常堆栈,并以此决定采取的行动,同时为用户提供更友好和更安全的反馈。如果您只需要处理某个HTTP
请求的异常,可以使用Django中的另一种处理方式。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python中通过Django捕获所有异常的处理 - Python技术站