【问题标题】:For a Django middleware class, how can process_request work just fine, but process_exception not be calls?对于 Django 中间件类, process_request 怎么能正常工作,但 process_exception 不是调用?
【发布时间】:2011-06-24 10:55:03
【问题描述】:

我在 Django 中创建了我自己的中间件类,直到最近它还运行良好。奇怪的是 process_request 仍然被调用得很好,但是即使响应是 500 - internal server error,process_exception 也根本没有被调用。为什么?

将我的中间件类声明为设置文件中已安装中间件列表中的第一个或最后一个条目没有区别。

谢谢, 戴夫

【问题讨论】:

  • 会不会,process_exception 本身会引发异常?
  • import pdb;pdb.set_trace() 放在process_exception 方法的开头,然后启动runserver 并导致500 错误。如果 runserver 进入 pdb 会话,则肯定会调用您的方法。然后,逐步查看会发生什么。
  • 我遇到了同样的问题。我想向异常电子邮件添加详细信息。我从stackoverflow.com/questions/6678895/… 找到了解决方案。我实现了并且 process_exception() 似乎没有运行。我添加了一个 process_request() 方法并附加了 request.META['MYVAR'] = "funky" 并包含在电子邮件中,但我似乎无法让 process_exception() 触发。我还在 MIDDLEWARE_CLASSES 设置中尝试了不同的位置(第一个和最后一个)。
  • 我尝试排除中间件类,直到将其缩小到 AuthenticationMiddle 类。当排除那个时,我的 process_exception() 运行,但如果启用它,我的不会运行,标准的会运行。
  • @Justin Poliey 这个问题已经快一年了,我无法快速访问可以让我验证解决方案的代码。我有责任为要奖励的赏金选择答案吗?

标签: django middleware django-middleware


【解决方案1】:

process_exceptiononly gets invoked when the view raises an Exception。正如评论中所说

如果视图引发异常,请通过异常中间件运行它,
如果异常中间件返回响应,请使用它。
否则,重新引发异常。

由于配置错误、导入错误、process_requestprocess_view 引发的异常无法被捕获并提供给 process_exception 处理程序。

要测试您的process_exception 是否有效,请在确保其正常工作后在视图中引发异常。

process_requestprocess_exception 之间没有直接关系,它们是用于不同目的的处理程序,并在不同阶段被调用。在成功执行的process_request 之后和视图之前引发的任何异常都不会被process_exception 捕获和处理。

【讨论】:

    【解决方案2】:

    根据文档 process_exception,

    process_exception(self, request, exception)
    

    接受一个HttpRequest对象,一个视图函数引发的异常对象作为参数,并返回一个HttpResponse对象作为响应。因此,当代码引发500错误(一个HttpResponse对象)时,它不会被调用。process_exception将被调用仅适用于视图中未捕获的异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-10
      • 1970-01-01
      • 2021-11-23
      • 2021-06-13
      • 1970-01-01
      • 2017-04-14
      • 2021-08-27
      • 1970-01-01
      相关资源
      最近更新 更多