如何在模板中解析变量'未知'时调试“异常”?

时间:2017-04-27 17:00:47

标签: python django django-templates

我一直在看

DEBUG Exception while resolving variable 'exception_type' in template 'unknown'.

在我的django日志中,然后是

VariableDoesNotExist: Failed lookup for key [exception_type] in

后面看起来像是包含请求的字典列表的字符串表示,以及我的整个settings.py文件。

另一个例子:

DEBUG Exception while resolving variable 'lastframe' in template 'unknown'

我觉得我没有足够的信息来调试这个。我所知道的是,在未知模板中有一个名为exception_type的变量。我的代码在任何地方都不包含字符串'exception_type'。

我该如何调试? 我应该在哪里看?

  • Ubuntu 14.04
  • Python 2.7.6
  • Django 1.11

2 个答案:

答案 0 :(得分:0)

该点不是变量'lastframe'或变量'exception_type'
您必须签出您的网址, 所有网址,而不仅仅是后端网址,都包括前端网址。 注意前端URL和中间件(如果您编写了自己的中间件文件,则最好的检查方法是在URL上测试admin)。 我有同样的问题。当我检查url和中间件时,我解决起来很容易。 希望对您有帮助

答案 1 :(得分:0)

这可能为时已晚。我必须花一个多小时来解决这个问题并加以解决。因此,该解决方案可以帮助某人。

我正在使用Django 2.2.6和python 3.6。当我记录错误并配置了AdminEmailHandler时,此问题发生在我身上。不管设置文件中配置的ADMINS是什么,都将执行AdminEmailHandler。如果未设置ADMINS,则不会发送电子邮件。

django.utils.log中的以下代码正在尝试构建要发送的电子邮件消息格式,但由于未发送exc_info而失败。您可以看到我的以下说明。

# exc_info is a tuple (execetion_type, message, exception_value_or_tb)
# 
if record.exc_info:
    exc_info = record.exc_info
else:
    exc_info = (None, record.getMessage(), None)

reporter = ExceptionReporter(request, is_email=True, *exc_info)
message = "%s\n\n%s" % (self.format(no_exc_record), reporter.get_traceback_text())
html_message = reporter.get_traceback_html() if self.include_html else None
self.send_mail(subject, message, fail_silently=True, html_message=html_message)

为避免上述错误,应通过带有以下日志记录的方式传递exc_info。 exc_info将提供exception_type和exception_value。我可以通过这种方式解决问题。因此,在错误日志记录中将捕获的异常作为exc_info传递将解决此问题。

try:
    raise Exception("sample exception")
except Exception as e:
    logger.error(str(e), exc_info=e)

记录模块有点不正确。根据文档,将 exp_info期望为布尔值。但是logging._log方法是检查exc_info是否存在异常。这就是造成我相信的问题。

# from logging.__init__.py
def error(self, msg, *args, **kwargs):
    """
    Log 'msg % args' with severity 'ERROR'.

    To pass exception information, use the keyword argument exc_info with
    a true value, e.g.

    logger.error("Houston, we have a %s", "major problem", exc_info=1)
    """
    if self.isEnabledFor(ERROR):
        self._log(ERROR, msg, args, **kwargs)


def exception(self, msg, *args, exc_info=True, **kwargs):
    """
    Convenience method for logging an ERROR with exception information.
    """
    self.error(msg, *args, exc_info=exc_info, **kwargs)

def _log(self, level, msg, args, exc_info=None, extra=None, stack_info=False):
    """
    Low-level logging routine which creates a LogRecord and then calls
    all the handlers of this logger to handle the record.
    """
    sinfo = None
    if _srcfile:
        #IronPython doesn't track Python frames, so findCaller raises an
        #exception on some versions of IronPython. We trap it here so that
        #IronPython can use logging.
        try:
            fn, lno, func, sinfo = self.findCaller(stack_info)
        except ValueError: # pragma: no cover
            fn, lno, func = "(unknown file)", 0, "(unknown function)"
    else: # pragma: no cover
        fn, lno, func = "(unknown file)", 0, "(unknown function)"
    if exc_info:
        if isinstance(exc_info, BaseException):
            exc_info = (type(exc_info), exc_info, exc_info.__traceback__)
        elif not isinstance(exc_info, tuple):
            exc_info = sys.exc_info()
    record = self.makeRecord(self.name, level, fn, lno, msg, args,
                             exc_info, func, extra, sinfo)
    self.handle(record)