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

Rya*_*zel 38 django

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

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

Yuj*_*ita 29

更新 - 2016年

这篇文章仍然受到欢迎.

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

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

原始答案

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

否则,我会编写一个记录异常的中间件,但如果你想要堆栈跟踪,那就更难了.这是文档.

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())))
Run Code Online (Sandbox Code Playgroud)

  • 我认为将异常记录到控制台会更好. (6认同)
  • 我认为,当你调试时,将'DEBUG`*关闭*是违反直觉的.令人难以置信的是Django还没有做到这一点! (2认同)

Set*_*eth 14

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

此外,您可以使用logging模块并将输出重定向到stdout.在settings.py这样的东西:

import logging.config

logging.config.fileConfig('/path/to/logging.conf')
Run Code Online (Sandbox Code Playgroud)

然后创建一个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
Run Code Online (Sandbox Code Playgroud)

查看python文档以获取更多详细信息和更多示例.


Ada*_*ing 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'
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

有关Django实现Python记录器的更多信息,请参阅有关记录文档.


Anu*_*har 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
Run Code Online (Sandbox Code Playgroud)

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

Yuji的上述答案中间件文档帮助我实现了这个解决方案.