Где в 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 в папку с шаблонами, и он будет использовать это.