Django request.is_ajax возвращает false - PullRequest
18 голосов
/ 21 декабря 2011

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

Ответы [ 6 ]

17 голосов
/ 21 декабря 2011

Я не знаю, что с тобой случилось. Я проверил и получил хорошее сообщение: 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>
11 голосов
/ 02 декабря 2014

Похоже, is_ajax просто проверяет заголовок HTTP_X_REQUESTED_WITH (выглядит как X-Requested-With в HTTP). Если оно равно XMLHttpRequest, у нас есть запрос ajax.

Так что теперь довольно легко проследить судьбу этого заголовка:

  1. Посмотрите на исходный HTTP-запрос (используя плагин отладки браузера, Wireshark, tcpdump или любой другой инструмент, который вы предпочитаете) и посмотрите, имеет ли он правильный заголовок HTTP_X_REQUESTED_WITH. Если это не так, проблема связана с jQuery (или вашим скриптом).

  2. Заголовок может быть потерян во время перенаправления, как сказал Дэниэл Роузман (я сам этого не видел, но почти уверен, что это возможно). В этом случае вы увидите два (или более) связанных HTTP-запроса, и у одного из них не будет заголовка HTTP_X_REQUESTED_WITH. В этом случае проблема может быть связана с самой конфигурацией или перенаправлением веб-сервера (возможно, вам придется избавиться от него или вручную передать заголовок, если ваш код перенаправления генерирует ответ).

  3. Кроме того, HTTP-прокси могут сократить заголовки. В этом случае вы можете посмотреть HTTP-запрос на стороне сервера через инспектор трафика или request.environ (довольно искаженный с помощью переменных среды, но HTTP-заголовки тоже есть).

5 голосов
/ 21 декабря 2011

Возможно, у вас включен APPEND_SLASH (по умолчанию), и Django перенаправляет с /ajax_test на /ajax_test/, но не сохраняет соответствующий заголовок. Лучше запросить версию с косой чертой в первую очередь.

1 голос
/ 21 декабря 2011

Скорректировал мой код следующим образом:

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>
0 голосов
/ 12 февраля 2017

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

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

    (...)
    data: { csrfmiddlewaretoken: '{{ csrf_token }}',
    (...)
})
0 голосов
/ 21 декабря 2011

Попробуйте с другой версией jQuery ... возможно, проблема была в js ...

Например:

http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js

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