Подтвердить что ты не робот

Как я могу заставить Django печатать отладочную информацию на консоли?

Я использую urlib для моего приложения, а не браузера, поэтому я не вижу экран отладки при возникновении ошибки. Какой лучший способ отправить обычную информацию об отладке в консоль или файл?

Изменить: я уже улавливаю вывод страницы, но когда я печатаю ее на экране, она заполняется тоннами бесполезного html. я могу получить только ошибку?

4b9b3361

Ответ 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'
}