Как получить текстовую страницу с ошибкой Django
Во время разработки я запускаю Django в режиме Debug, и я отправляю данные в свое приложение, используя приложение текстового режима. В идеале мне нужно получить текстовый ответ, когда я получаю код ошибки http 500, поэтому мне не нужно искать реальную ошибку внутри всего этого HTML и Javascript.
Возможно ли получить внутреннюю ошибку сервера Django 500 в виде обычного текста?
Ответы
Ответ 1
Я думаю написать промежуточное ПО, потому что иначе исключение не доступно в файле 500.html
http://docs.djangoproject.com/en/dev/topics/http/middleware/#process-exception
class ProcessExceptionMiddleware(object):
def process_exception(self, request, exception):
t = Template("500 Error: {{ exception }}")
response_html = t.render(Context({'exception' : exception }))
response = http.HttpResponse(response_html)
response.status_code = 500
return response
Ответ 2
Если вы ищете способ получить страницу с простой текстовой ошибкой при использовании curl
, вы
необходимо добавить HTTP-заголовок X-Requested-With
со значением XMLHttpRequest
, например.
curl -H 'X-Requested-With: XMLHttpRequest' http://example.com/some/url/
Объяснение: это потому, что Django использует метод is_ajax
, чтобы определить, следует ли возвращать текст как обычный текст или HTML. is_ajax
, в свою очередь, смотрит на X-Requested-With
.
Ответ 3
Там установлена настройка DEBUG_PROPAGATE_EXCEPTIONS, которая заставит Django не обертывать исключения, поэтому вы можете их увидеть, например. в журналах devserver.
Ответ 4
Это улучшение в ответе Yuji, в котором содержится stacktrace, больше инструкций (для нас, новичков django) и проще.
Поместите этот код в файл где-нибудь в вашем приложении, например. PROJECT_ROOT/MAIN_APP/middleware/exceptions.py
и убедитесь, что у вас есть пустой __init__.py
в том же каталоге.
import traceback
from django.http import HttpResponse
class PlainExceptionsMiddleware(object):
def process_exception(self, request, exception):
return HttpResponse(traceback.format_exc(exception), content_type="text/plain", status=500)
Теперь отредактируйте свой settings.py
и найдите MIDDLEWARE_CLASSES = (
. Добавьте еще одну запись, чтобы она выглядела так:
MIDDLEWARE_CLASSES = (
# (all the previous entries)
# Plain text exception pages.
'MAIN_APP.middleware.exceptions.PlainExceptionsMiddleware',
)
Перезапустите django, и вам хорошо идти!
Форматирование, поддерживающее пользовательский агент.
Если вы похожи на меня и разрабатываете приложение и веб-сайт, поддерживаемые django, вы, вероятно, захотите отобразить страницы с открытым текстом в приложении и красивые отформатированные в браузере. Простым способом для этого является проверка агента пользователя:
import traceback
from django.http import HttpResponse
class PlainExceptionsMiddleware(object):
def process_exception(self, request, exception):
if "HTTP_USER_AGENT" in request.META and "chrome" in request.META["HTTP_USER_AGENT"].lower():
return
return HttpResponse(traceback.format_exc(exception), content_type="text/plain", status=500)