django - Django 中间件捕获异常
问题描述
我正在尝试创建一个 Django 中间件来检查视图是否引发异常。
您能否举例说明如何出现异常以及如何通过自定义中间件进行处理。
最后,我想将这些异常存储在数据库中。
更新:我试图通过登录过程来实现这一点。这没有用。
解决方案
好吧,您可以尝试捕获中间件中的任何异常,如下所示:
from django.core.urlresolvers import resolve
class SimpleMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
if response.status_code == 500:
current_url = resolve(request.path_info).view_name
content = response.content
ExceptionHandlerModel.objects.create(url = current_url,stacktrace = content, ...) # other data you want to store here
return response
就是这样,除非您将内容存储在html中,否则它没有任何意义。所以我认为你应该完全避免这个解决方案。response.content
最好的方法是使用logger。例如在你的loginview
,你可以这样尝试:
import logging
logger = logging.getLogger(__name__)
def loginview(request):
...
user = authenticate(username, password)
if not user:
logger.error('Username {} failed to login'.format(username))
登录视图也不一定抛出异常(除非你强行抛出它们)。例如:
class YourAuthException(Exception):
# defining a custom exception
pass
# in view
if not user:
raise YourAuthException("User login failed")
更新
def get_user(request)
user = User.objects.get(id=99999999999) # an id which does not exist in DB
return HttpResponse("OK GOT IT")
推荐阅读
- json - XML 转 JSON | 弹簧靴 | 杰克逊
- symfony - 从数据库加载 Symfony (5.2) 配置
- c# - 如何使用具有多个属性级别的包含从 thenInclude 获取特定列
- c++ - 如何启用从一类到另一类的转换?
- node.js - NPM安装问题无法下载win32-x64-83_binding.node
- c++ - 如何在 C++ 中计算日出和日落?
- labview - Mavlink 与 LabView 的整合
- python - Python 和 C 结构之间的大小不匹配,默认结构对齐/填充
- sql - Rank() 基于列条目,而数据按日期排序
- amazon-web-services - 用户的 AWS S3 文件夹权限