AJAX и Python: текст ответа от скрипта python является объектом

Исправлена ​​глупая ошибка

Я использую AJAX для доступа к скрипту Python, получаю некоторый ТЕКСТ из скрипта Python и отображаю его на своей веб-странице.

Моя проблема: в том, что текст ответа "не определен", хотя должен быть "bbbb"

Я не понимаю, где я ошибаюсь? Это мой скрипт Python неверен (не обрабатывает AJAX (? запросы?) правильно), это мой javascript или это мой сервер WSGI, который я сделал?

HTML и Javascript:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script type="text/javascript">
    <!--
        function post( dest, params )
        {
            var xmlhttp;

            if (window.XMLHttpRequest)
            {// code for IE7+, Firefox, Chrome, Opera, Safari
                xmlhttp=new XMLHttpRequest();
            }
            else
            {// code for IE6, IE5
                xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
            }

            xmlhttp.onreadystatechange=function()
            {
                if (xmlhttp.readyState==4 && xmlhttp.status==200)
                {
                    return xmlhttp.responseText;
                }
            }

            xmlhttp.open("POST",dest,true);
            xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
            xmlhttp.send( params ); 
        }


        function onTest()
        {
            var response = post( "cgi/aaa.py", "email=blah" );
            var output   = document.getElementById( "bb" );

            output.innerHTML = response;
            alert( response );
        }
    -->
    </script>
</head>

<body>

    <p id="bb"> abcdef </p>
    <a href="javascript:onTest()">Click it</a>

</body>

</html>

Мой скрипт на питоне:

import cgitb; cgitb.enable()
import cgi
import os


input_data   = cgi.FieldStorage()

print "bbbb"
#print "you said: " + input_data['email']

person Mack    schedule 28.02.2011    source источник


Ответы (3)


Вы получаете неопределенность, потому что вы только что разместили сообщение и не дождались ответа. Ваш вызов alert должен быть внутри изменения статуса, где у вас сейчас return xmlhttp.responseText;. Помните, что функции Javascript (кроме alert по иронии судьбы) не блокируются.

person Malvolio    schedule 01.03.2011
comment
старайтесь больше понимать других. не предполагайте, что вещи очевидны, говоря, конечно... это может быть очевидно для вас, но не для других. у всех нас есть свои сильные и слабые стороны, и мы все здесь, чтобы учиться и делиться своими знаниями. - person henry bemis; 08.02.2013

Возможно, вам следует использовать response, а не output в этой функции. output ссылается на элемент с id="bb", поэтому innerHTML на самом деле устанавливается правильно:

   function onTest()
    {
        var response = post( "cgi/aaa.py", "email=blah" );
        var output   = document.getElementById( "bb" );

        output.innerHTML = response;
        alert( response );
    }
person Blender    schedule 28.02.2011

Проблема в следующем:

var output   = document.getElementById( "bb" );
...
alert( output );
...
<p id="bb"> abcdef </p>

Вывод переменной указывает на элемент DOM с идентификатором «bb», который является тегом абзаца HTML.

Я думаю, вы, вероятно, хотели напечатать response.

person Marc Abramowitz    schedule 28.02.2011
comment
Я чувствую себя идиотом, лол, глупая ошибка, НО это не исправлено. Теперь он возвращает undefined ?? - person Mack; 01.03.2011
comment
Да, другая ваша проблема в том, что вы пытаетесь использовать вывод функции post, которая возвращается сразу же, прежде чем вернется ответ. Все, что вы делаете с результатом вызова AJAX, должно происходить в функции обратного вызова, в вашем случае xmlhttp.onreadystatechange. Вы можете поискать простые примеры AJAX, чтобы получить представление о том, как это работает. - person Marc Abramowitz; 01.03.2011