如何让Django将调试信息打印到控制台?

时间:2011-02-28 00:13:28

标签: django

我正在使用urlib来点击我的应用而不是浏览器,所以当发生错误时我看不到调试屏幕。将正常调试信息发送到控制台或文件的最佳方法是什么?

编辑:我已经抓住了页面的输出但是当我将它打印到屏幕上时,它充满了大量无用的HTML。我可以得到错误吗?

6 个答案:

答案 0 :(得分:29)

更新 - 2016

这篇文章仍在热播。

我建议使用以下使用内置日志记录系统的方法之一。

同样,管理电子邮件处理程序通过管道传输异常,您可以将数据发送到控制台记录器,文件记录器或其他任何地方(单独或除了电子邮件处理程序之外)。

原始答案

嗯,最简单的方法是将调试模式设置为OFF并让django通过电子邮件向您发送错误消息,因为这需要5秒钟: http://docs.djangoproject.com/en/dev/howto/error-reporting/

否则,我会写一个记录异常的中间件,但是如果你想要堆栈跟踪,那就更难了。 Here's the documentation.

import traceback
import sys
from __future__ import print_function

class ProcessExceptionMiddleware(object):
    def process_exception(self, request, exception):
        # Just print the exception object to stdout
        print(exception)

        # Print the familiar Python-style traceback to stderr
        traceback.print_exc()

        # Write the traceback to a file or similar
        myfile.write(''.join(traceback.format_exception(*sys.exc_info())))

答案 1 :(得分:14)

如果您在本地运行开发服务器,则可以使用print

此外,您可以使用logging模块并将输出重定向到stdout。在settings.py中添加了类似的内容:

import logging.config

logging.config.fileConfig('/path/to/logging.conf')

然后创建logging.conf文件:

[loggers]
keys=root

[handlers]
keys=consoleHandler

[formatters]
keys=simpleFormatter

[logger_root]
level=DEBUG
handlers=consoleHandler

[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)

[formatter_simpleFormatter]
format=format=%(asctime)s - %(name)s - %(levelname)s - %(message)s

查看python documentation了解更多详情和更多示例。

答案 2 :(得分:13)

执行此操作的最佳方法是为django.requests设置日志记录处理程序。您可以通过将LOGGING设置添加到settings.py文件来执行此操作。下面是一个例子:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
        },
    },
    'handlers': {
        'console': {
            'level': 'NOTSET',
            'class': 'logging.StreamHandler',
            'formatter': 'verbose'
        }
    },
    'loggers': {
        '': {
            'handlers': ['console'],
            'level': 'NOTSET',
        },
        'django.request': {
            'handlers': ['console'],
            'propagate': False,
            'level': 'ERROR'
        }
    }
}

有了这个,每次返回500响应时,您都会在终端中看到一个很好的堆栈跟踪。

有关Django实现Python记录器的更多信息,请参阅documentation about logging

答案 3 :(得分:5)

我收到500内部服务器错误并且无法调试它,因为代码未通过浏览器访问,终端没有显示回溯。 中间件中的这段代码完全不同:

import traceback
import sys

class ProcessExceptionMiddleware(object):
    def process_response(self, request, response):
        if response.status_code != 200:                
            print '\n'.join(traceback.format_exception(*sys.exc_info()))
        return response

而不是处理异常I,处理响应对象并在状态代码不是200时打印回溯,现在我可以看到导致错误的原因。在这种特殊情况下,这是一个不正确的缩进块。

Yuji's answer abovemiddleware documentation帮助我找到了解决方案。

答案 4 :(得分:1)

答案是创建一个django中间件来捕获所有的exeptions。

当你抓住它们时,你可以将它们重定向到你想要的任何东西。

文档在这里:

http://docs.djangoproject.com/en/dev/topics/http/middleware/#process-exception

答案 5 :(得分:1)

好的,我认为这是一个重要的事情需要注意,因为它是2016年,许多人使用Django Rest Framework而不是标准的django表格,我浪费了2个小时来弄清楚为什么我的例外处理由一个渲染器,它永远不会到达中间件,问题的解决方案很简单。

http://www.django-rest-framework.org/api-guide/exceptions/#custom-exception-handling

所以这样:

import traceback

from rest_framework.views import exception_handler

def custom_exception_handler(exc, context):
    # Call REST framework's default exception handler first,
    # to get the standard error response.
    response = exception_handler(exc, context)
    traceback.print_exc()
    return response

然后在设置中定义异常处理程序:

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'utils.custom_exception_handler.custom_exception_handler'
}