我怎样才能让Django打印debugging信息到控制台?

我正在使用urlib来打我的应用程序不是浏览器,所以当发生错误时,我看不到debugging屏幕。 将普通debugging信息发送到控制台或文件的最佳方式是什么?

编辑:我已经捕捉的页面的输出,但是当我打印到屏幕上它充满了吨无用的HTML。 我可以得到只是错误?

更新 – 2016年

这篇文章仍然是点击。

我build议使用下面使用内置日志logging系统的方法之一。

与pipe理电子邮件处理程序pipe理exception的方式相同,您可以将数据发送到控制台logging程序,文件logging程序或其他任何地方(仅限电子邮件处理程序或除电子邮件处理程序以外)。

原始答案

那么,最简​​单的方法是设置debugging模式closures,让Django的电子邮件给你的错误,因为这实际上需要5秒钟: http : //docs.djangoproject.com/en/dev/howto/error-reporting/

否则,我会编写一个loggingexception的中间件,但是如果您想要堆栈跟踪,则会更加痛苦。 这里是文档。

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()))) 

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

另外,您可以使用logging模块并将输出redirect到stdout 。 在settings.py如下所示的内容:

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

然后创build一个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文档以获得更多的细节和更多的例子。

最好的方法是为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响应返回时,你会在terminal中看到一个很好的堆栈跟踪。

有关Django实现Pythonlogging器的更多信息,请参阅文档。 在这里input链接描述

我得到500内部服务器错误,不能debugging它,因为代码不是通过浏览器访问和terminal没有显示回溯。 在中间件中的这一点代码造成了所有的不同:

 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 

我不处理exceptionI,而是处理响应对象,并在状态码不为200时打印回溯,现在我可以看到是什么导致了错误。 在这个特定情况下,这是一个不正确的缩进块。

上面的Yuji的答案和中间件文档帮助我达到了这个解决scheme。

答案是创build一个django中间件来捕捉所有的东西。

当你抓住他们,你可以redirect到任何你想要的。

文档在这里:

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

好吧,我认为这是一个重要的事情要注意,因为它是2016年,许多人使用Django的Rest框架,而不是标准的Django的forms,我已经浪费了2个小时,弄清楚为什么我的exception是由一个渲染器处理从来没有到中间件,问题的解决scheme很简单。

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

所以导入追踪

 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 

然后在设置中定义这样的exception处理程序:

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