request.is_ajax () == True при нажатии кнопки назад? - PullRequest
3 голосов
/ 06 февраля 2012

У меня есть приложение Django, которое возвращает разные ответы в зависимости от того, является ли запрос страницы Ajax или нет.

Когда я просматриваю страницу, перемещаюсь в другое место, затем нажимаю кнопку «Назад», запрос обрабатывается так, как если бызначение для request.is_ajax() Истина.Поэтому вывод JSON отображается в браузере, а не в сгенерированном HTML.

Почему это может происходить и как я могу предотвратить это?

Пояснения

Это происходитв Chrome (16.0.912.77)

Смущает то, что я на самом деле am делаю ajax-запросы этого URL в фоновом режиме.По сути, я перегрузил URL-адрес, чтобы он одновременно отображал содержимое в отформатированном HTML-коде, а также делал его доступным в формате JSON (так как изменения происходят со временем, я могу обновить страницу THML в режиме реального времени).Возможно, самое простое решение, которое разочаровывает, - это создать отдельный шаблон URL-адреса Django для версии Ajax.

1 Ответ

2 голосов
/ 06 февраля 2012

Из документов Django :

Возвращает True, если запрос был сделан через XMLHttpRequest, проверка заголовка HTTP_X_REQUESTED_WITH для строки 'XMLHttpRequest'.

Итак, вопрос в том, почему нажатие кнопки «назад» прикрепляет этот заголовок к запросу? Это не похоже на соответствующее поведение в любом браузере. Итак, на каких браузерах вы это попробовали? У них всех одинаковое поведение? Если нет, какие дополнения вы установили в браузере-нарушителе, который может вызвать такую ​​проблему?

EDIT

Вам не обязательно создавать совершенно отдельный вид и / или urlpattern, но использование строки запроса может быть плохой идеей. В REST для одного и того же представления нередко возвращается несколько разных форматов, но обычно это делается так:

http://domain.com/some/view/      # Returns HTML
http://domain.com/some/view/?json # Returns JSON

Это небольшой компромисс, которого может быть достаточно, чтобы обойти вашу проблему.

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