Как получить текстовую страницу ошибки Django - PullRequest
12 голосов
/ 07 февраля 2011

Во время разработки я запускаю Django в режиме отладки и отправляю данные в свое приложение с помощью приложения в текстовом режиме. В идеале мне нужно получить простой текстовый ответ, когда я получу http-код ошибки 500, поэтому мне не нужно искать настоящую ошибку во всем этом HTML и Javascript.

Можно ли получить внутреннюю ошибку сервера Django 500 в виде простого текста?

Ответы [ 4 ]

19 голосов
/ 01 февраля 2014

Если вы ищете способ получить страницу ошибки в виде простого текста при использовании 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.

9 голосов
/ 07 февраля 2011

Есть настройка DEBUG_PROPAGATE_EXCEPTIONS , которая заставит Django не переносить исключения, чтобы вы могли их видеть, например, в журналах devserver.

8 голосов
/ 07 февраля 2011

Я думаю написать промежуточное ПО, потому что иначе исключение не доступно в 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
1 голос
/ 04 октября 2012

Это улучшение ответа Юджи, которое предоставляет трассировку стека, больше инструкций (для нас новичков в 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...