Как получить текстовую страницу с ошибкой 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)