Django request.is_ajax возвращает false
Я тестирую ajax с помощью Django + jQuery. У меня это в моих взглядах:
def ajax_test(request):
if request.is_ajax():
message = "This is ajax"
else:
message = "Not ajax"
return HttpResponse(message)
и это в моем шаблоне:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script type="text/javascript" src="{{ STATIC_URL }}js/jquery-1.6.4.js"></script>
</head>
<body>
<script>
$.get("/ajax_test", function(data) {
alert(data);
});
});
</script>
</body>
</html>
Мой вопрос: почему это возвращает "Не ajax" на мою html-страницу?
Ответы
Ответ 1
Я не знаю, что с тобой случилось. Я тестировал и получил хорошее сообщение: This is ajax
. Мой код:
urls.py
url(r'^$', 'myapp.views.home', name='home'),
url(r'^ajax_test/$', 'myapp.views.ajax_test', name='ajax_test'),
views.py
def home(request):
return render_to_response('home.html', {},
context_instance=RequestContext(request))
def ajax_test(request):
if request.is_ajax():
message = "This is ajax"
else:
message = "Not ajax"
return HttpResponse(message)
Шаблоны /home.html
<!DOCTYPE html>
<html>
<head>
<title></title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
</head>
<body>
<script type="text/javascript">
$(document).ready(function () {
$.get("/ajax_test/", function (data) {
alert(data);
});
});
</script>
</body>
</html>
Ответ 2
Похоже, что is_ajax
просто проверяет заголовок HTTP_X_REQUESTED_WITH
. Если он равен XMLHttpRequest
, у нас есть запрос ajax.
Так что теперь легко проследить судьбу этого заголовка:
-
Посмотрите на начальный HTTP-запрос (используя плагин отладки браузера, Wireshark, tcpdump или любой другой инструмент, который вы предпочитаете) и посмотрите, есть ли у него правильный заголовок HTTP_X_REQUESTED_WITH
. Если это не так, проблема связана с jQuery (или вашим script).
-
Заголовок может быть потерян во время перенаправления, как сказал Даниэль Роземан (не видел этого сам, но почти уверен, что это возможно). В этом случае вы увидите два (или более) закодированных HTTP-запроса, и одному из них не будет заголовок HTTP_X_REQUESTED_WITH
. В этом случае проблема может быть связана с конфигурацией или перенаправлением веб-сервера (вам, возможно, придется избавиться от нее или вручную передать заголовок, если ответ на перенаправление генерируется вашим кодом).
-
Кроме того, HTTP-прокси могут вырезать заголовки. В этом случае вы можете посмотреть HTTP-запрос на стороне сервера через инспектор трафика или request.environ
(довольно искаженный с помощью окружения vars, но HTTP-заголовки также есть).
Ответ 3
Вероятно, вы включили APPEND_SLASH (по умолчанию), а Django перенаправляет от /ajax_test
до /ajax_test/
, но не сохраняет соответствующий заголовок. Лучше сначала запросить версию с косой чертой.
Ответ 4
Настроил мой код на следующее:
views.py:
def index(request):
return render_to_response('index.html',
locals(), context_instance=RequestContext(request))
def ajax_test(request):
if request.is_ajax():
message = "This is ajax"
else:
message = "Not ajax"
return HttpResponse(message)
urls.py:
urlpatterns = patterns('',
# root
url(r'^$', views.index, name='index'),
# ajax
url(r'^ajax_test/$', views.ajax_test, name='ajax_test'),
)
шаблон:
...
<script type="text/javascript">
$(document).ready( function() {
$.get("/ajax_test/", function(data) {
alert(data);
});
});
</script>
Ответ 5
Попробуйте с другой версией jQuery... возможно, что проблема была в js...
Например:
http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js
Ответ 6
В своем вызове .get
вы должны указать токен CSRF. Я не знаю, если это проблема, но должна помочь.
.get(..., function(data) {
(...)
data: { csrfmiddlewaretoken: '{{ csrf_token }}',
(...)
})