【问题标题】:Django Unhandled ExceptionDjango 未处理的异常
【发布时间】:2009-12-18 02:24:23
【问题描述】:

它在 DEBUG = True 模式下运行。有时它会在遇到错误时抛出带有回溯信息的错误消息,但有时它只显示以下几行:

Unhandled Exception

An unhandled exception was thrown by the application.

我必须切换到开发服务器才能看到详细信息。

如何让它在遇到错误时始终显示回溯消息?

【问题讨论】:

  • 所以错误的显示并不一致,有什么模式显示哪些错误,哪些不显示?
  • 您如何为网站提供服务?你说在Nginx下面,但是是FastCGI吗?

标签: python django


【解决方案1】:

只需连接 got_request_exception 信号并记录异常:

from django.core.signals import got_request_exception
import logging    

def log(*args, **kwargs):
    logging.exception('error')

got_request_exception.connect(log)

这将记录整个跟踪。在开发服务器中,它登录控制台。

【讨论】:

    【解决方案2】:

    也许你可以使用这个sn-p,这会在apache的日志中记录异常:

    utils.py:

    def log_traceback(exception, args):
        import sys, traceback, logging
        exceptionType, exceptionValue, exceptionTraceback = sys.exc_info()
        logging.debug(exception)
        logging.debug(args)
        for tb in traceback.format_exception(exceptionType, exceptionValue, exceptionTraceback):
            logging.debug(tb)
    

    site_logging.py:

    import logging
    import sys
    
    logger = logging.getLogger('')
    logger.setLevel(logging.DEBUG)
    handler = logging.StreamHandler(sys.stderr)
    handler.setLevel(logging.DEBUG)
    formatter = logging.Formatter('%(levelname)-8s %(message)s')
    handler.setFormatter(formatter)
    logger.addHandler(handler)
    

    把它放在你的settings.py

    import site_logging
    

    在你的代码中:

    from where.is.your.utils import log_traceback
    try:
       `do something`
    except Exception, args:
        log_traceback(Exception, args)
    

    【讨论】:

      【解决方案3】:

      您使用的是 Apache 吗?
      只是出于兴趣,这是您想要查看回溯的生产或开发环境吗?

      来自DJango Book on security - Exposed error messages

      在 Apache 和 mod_python 下部署的用户还应确保他们的 Apache conf 文件中有 PythonDebug Off;这将确保在 Django 有机会加载之前发生的任何错误都不会公开显示。

      我假设你想要 PythonDebug On,这仅推荐用于开发。

      【讨论】:

      • 我正在使用关闭 PythonDebug 的 mod_python,我仍然可以在我的设置中切换 DEBUG = True 以快速解决问题。它仍然为我提供了方便的 django 调试页面,而不是 apache 的 500 内部服务器错误页面。
      • 对不起杰克,没有使用过 Nginx,所以也许有 Nginx 的人可以帮助解决问题。 Brandon - 这可能是 Nginx 特有的吗?
      【解决方案4】:

      这就是 DEBUG=True 的用途:显示完整的回溯。这个想法是普通用户不希望(您也不希望他们)看到除了简单的错误消息之外的任何内容。

      【讨论】:

      • 在 500 调试页面处理之外发生某些错误,您仍然会从网络服务器收到原始错误。
      • 是的,我也注意到有时我得到 mod_python 错误页面而不是 Django 页面。
      猜你喜欢
      • 2012-06-05
      • 1970-01-01
      • 1970-01-01
      • 2018-08-25
      • 1970-01-01
      • 2011-11-19
      • 2013-06-06
      • 1970-01-01
      相关资源
      最近更新 更多