Как я могу заставить Django печатать отладочную информацию на консоли?
Я использую urlib для моего приложения, а не браузера, поэтому я не вижу экран отладки при возникновении ошибки. Какой лучший способ отправить обычную информацию об отладке в консоль или файл?
Изменить: я уже улавливаю вывод страницы, но когда я печатаю ее на экране, она заполняется тоннами бесполезного html. я могу получить только ошибку?
Ответы
Ответ 1
Обновление - 2016
Этот пост по-прежнему получает хиты.
Я рекомендую использовать один из подходов ниже, который использует встроенную систему ведения журнала.
Точно так же исключения обрабатываются обработчиком электронной почты администратора, вы можете отправлять данные в консольный регистратор, регистратор файлов или где-либо еще (исключительно или в дополнение к обработчику электронной почты.)
Оригинальный ответ
Ну, самый простой способ - отключить режим отладки и позволить 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())))
Ответ 2
Если вы используете локальный сервер разработки, вы можете просто использовать 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 для получения более подробной информации и дополнительных примеров.
Ответ 3
Лучший способ сделать это - настроить обработчик ведения журнала для 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 см. в документах. введите ссылку здесь
Ответ 4
Я получал 500 Internal Server Error и не смог отладить его, поскольку код не был просмотрен через браузер, а терминал не показывал трассировку.
Этот бит кода в промежуточном программном обеспечении сделал все возможное:
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
Вместо обработки исключения я обрабатываю объект ответа и печатаю трассировку, когда код состояния не 200 и вуаля теперь могу видеть, что вызывает ошибку. Который в этом конкретном случае был неправильным отступом.
Ответ Yuji выше и документация промежуточного программного обеспечения помогли мне достичь этого решения.
Ответ 5
Ответ на этот вопрос - создать промежуточное ПО django, чтобы поймать все исключения.
Когда вы их поймаете, вы можете перенаправить их на все, что захотите.
Документация находится здесь:
http://docs.djangoproject.com/en/dev/topics/http/middleware/#process-exception
Ответ 6
Хорошо, ребята, я думаю, что это важно отметить, поскольку в 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 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'
}