Как получить ошибки сервера в AJAX-запросе в Django - PullRequest
0 голосов
/ 04 июля 2011

Я использую этот код

if form.is_valid(): 
            form.save()
            if request.POST.get('ajax') == 'true':
                return HttpResponse('Data Entered Successfully') # Redirect after POST
            else:
                return HttpResponseRedirect('/thanks/') # Redirect after POST

Я отправляю форму с помощью метода POST jquery.

Проблема возникает, когда у меня возникает какая-либо ошибка, такая как отступ или ошибка модели, тогда я надеваюничего не вернуть.Я должен был проверить страницу, отключив ajax и отправить с помощью обычного метода, а затем я вижу желтую страницу ошибки django, а затем я исправляю ошибку.

есть ли способ, даже если я получаю какую-либо ошибку, я вижу, чтов ответ на jquery

Ответы [ 2 ]

2 голосов
/ 04 июля 2011

В общем, вы можете зарегистрировать свой собственный обработчик500 и проверить, является ли запрос ajax, а затем вернуть ответ об ошибке ajax, который указывает, что произошло, если DEBUG равен True, или просто выдает общую ошибку, если DEBUG равен False.

Другие варианты: использовать Firebug или Chrome Inspector для просмотра ответа Ajax или настроить какую-либо форму ведения журнала, в котором регистрируются ошибки, что полезно, даже если сайт развернут, чтобы выполнить вскрытие ошибок.это может произойти.

Сам Django имеет встроенные возможности ведения журналов, одна из которых - отправка электронной почты администраторам, но вы можете определить свое собственное, используя интеграцию Django со встроенной системой регистрации Python .Одним из вариантов обработчика для них является django-sentry , который я использую на всех своих производственных сайтах для записи любой произошедшей ошибки, а также включает возможность переопределения обработчика 500 для предоставления конечному пользователю ссылочного номера, который можетиспользовать для поиска их точного экземпляра ошибки.

Sentry поставляется с 2 приложениями, одно из которых является сервером, а другое - клиентом.В типичных производственных условиях, когда несколько компьютеров обслуживают один и тот же сайт, у вас будет выделенный часовой сервер, который выполняет только часовой.Однако для отдельного сайта, в котором он интегрирован с сайтом, все в порядке.

Для настройки часового режима вам необходимо добавить sentry (сервер) и sentry.client (клиент) к вашему INSTALLED_APPS.Затем вам нужно будет настроить ведение журнала.

Вот пример:

LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,

    "handlers": {
        "mail_admins": {
            "class": "django.utils.log.AdminEmailHandler",
            "level": "ERROR"
        },
        "sentry": {
            "class": "sentry.client.handlers.SentryHandler",
            "level": "ERROR",
        }
    },

    "loggers": {
        "django.request": {
            "handlers": ["sentry", "mail_admins"],
            "level": "ERROR",
            "propagate": True
        }
    },
}

В приведенном выше примере все еще будут отправляться сообщения администраторам электронной почты в случае возникновения ошибки и DEBUG = False.Если вы не хотите, чтобы это делалось, удалите mail_admins из обработчиков на django.request.

1 голос
/ 01 октября 2012

Некоторое время назад я написал небольшую утилиту под названием django-ajaxerrors , которая предназначена именно для этого сценария.Он состоит из промежуточного программного обеспечения, которое подключается к ответам об ошибках, определяет, были ли они результатом AJAX-запроса, и открывает страницу технических ошибок django в новом окне браузера (поэтому исходная страница, отправившая запрос, остается прежней).

Я не знаю, как люди обходятся без AJAX и Django, но, может быть, я здесь не совсем объективен ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...