Django request.is_ajax возвращает false - программирование
Подтвердить что ты не робот

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-страницу?

4b9b3361

Ответ 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>

Ответ 6

В своем вызове .get вы должны указать токен CSRF. Я не знаю, если это проблема, но должна помочь.

.get(..., function(data) {

    (...)
    data: { csrfmiddlewaretoken: '{{ csrf_token }}',
    (...)
})