Где в django отображается трассировка по умолчанию 500, чтобы я мог использовать ее для создания своих собственных журналов?

Я хотел бы использовать его для генерации html-файлов журнала внутри метода process_exception() моего пользовательского класса промежуточного программного обеспечения, например:

  • Исключение поймано.
  • Вызвано process_exception (запрос).
  • process_exception вызывает любую функцию, возвращающую ошибку по умолчанию html.
  • process_exception записывает возвращенный html в папку журналов, где работает сервер django.

Я знаю, что Django способен отправлять электронные письма об этих исключениях, но я бы не стал их использовать. Я работаю над приложением RESTful, использующим JSON, и поэтому более уместно вернуть строку json с ошибкой 500, а затем поместить html в другое место.

Заранее спасибо.

Извините, возможно, мне нужно уточнить: я не хочу создавать свой собственный 500.html, я хочу использовать тот, который django использует, когда Debug=True. т.е. сгенерируйте файл ошибок и поместите его в папку журнала.

Спасибо Марку за помощь - вот мое решение для всех, кто интересуется:

import logging
import os
import settings
import sys
import datetime

from response import get_json_response
from django.views.debug import ExceptionReporter

logging.config.dictConfig(settings.LOGGING)
LOGGER = logging.getLogger('console_logger')

class LoggingMiddleware(object):

    def process_exception(self,request,exception):
        exc_type, exc_value, exc_traceback = sys.exc_info()
        er = ExceptionReporter(request, exc_type, exc_value, exc_traceback)
        time = str(datetime.datetime.now())
        file_path = os.path.join(settings.LOG_FOLDER, "{}.html".format(time))
        LOGGER.error("Writing error 500 traceback to %s" % file_path)
        file_handle = open(file_path,'w')
        file_handle.write(er.get_traceback_html())
        file_handle.close()
        return get_json_response(500,"HTTP Error 500: Internal Server Error")

Код перехватывает любые исключения, использует модуль sys и стандартный шаблон ошибок django s для генерации красиво отформатированной страницы с информацией о трассировке / исключении, а затем помещает ее в папку журнала перед возвратом объекта JSON, сообщающего, что произошла ошибка HTTP 500.

3 ответа

Решение

Страница 500 traceback использует строку шаблона (TECHNICAL_500_TEMPLATE) который жестко закодирован в django.views.debug, Отчет генерируется ExceptionReporter класс, который также включен в django.views.debug которую вы должны быть в состоянии изменить для создания своего журнала.

Если мы хотим показать исключения, которые генерируются в вашем шаблоне (500.html) тогда мы могли бы написать свой собственный просмотр 500, захватив исключение и передав его в свой шаблон 500.

шаги:

В my_app.views.py

import sys
import traceback

from django.http.response import HttpResponseServerError
from django.template import loader
from django.template.context import Context, RequestContext


def custom_500(request):
    t = loader.get_template('500.html')
    type, value, tb = sys.exc_info()
    return HttpResponseServerError(
        t.render(
            Context({
                'exception_value': value,
                'value': type,
                'tb': traceback.format_exception(type, value, tb)
            }, RequestContext(request))
        )
    )

В основном Urls.py

from django.conf.urls.defaults import *
handler500 = 'my_app.views.custom_500'

В шаблоне (500.html)

{{ exception_value }}{{value}}{{tb}}

Подробнее об этом здесь: https://docs.djangoproject.com/en/dev/topics/http/views/

Дубликат: шаблон не существует: 500.html

По сути, просто поместите 500.html в папку с шаблонами, и он будет использовать это.

Другие вопросы по тегам