WSGI: используйте AJAX для получения строки из скрипта Python

Я копаюсь в WSGI, и это довольно сложно.

Я пытаюсь сделать что-то довольно простое: когда я нажимаю ссылку, я хочу получить строку «привет» из сценария Python и отобразить «привет» в элементе абзаца HTML.

Теперь я создал сценарии python WSGI, которые отображают текст HTML, т. Е. Обслуживают страницу с использованием WSGI python, но не использовали Python, AJAX и WSGI вместе для вышеупомянутой цели.

Сейчас происходит следующее: когда я нажимаю ссылку на моей HTML-странице, в элементе абзаца отображается «ошибка», а не «привет». Как вы думаете, где я ошибаюсь? в Python или JavaScript?

Правильно ли мой скрипт Python ниже ?:

#!/usr/bin/env python

from wsgiref.simple_server import make_server
from cgi import parse_qs, escape

def application(environ, start_response):

   return [ "hello" ]

if __name__ == '__main__':
    from wsgiref.simple_server import make_server
    srv = make_server('localhost', 8000, application)
    srv.serve_forever()

Может быть, это мой Javascript и / или HTML, где я ошибаюсь ?:

<!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 onTest( 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)
                {
                    document.getElementById( "bb" ).innerHTML = xmlhttp.responseText;
                }
            }

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


    -->
    </script>
</head>

<body>

    <p id="bb"> abcdef </p>
    <a href="javascript:onTest('aaa.py', '')">Click it</a>

</body>

</html>

Шаги, которые я предпринимаю для его тестирования:
- Запустите сценарий поддельного сервера wsgi
- откройте браузер и введите http://localhost:8000/test.html
- нажмите ссылку на html-странице и получите ответ "ошибка"

Мои файлы wsgi.py, aaa.py и test.html находятся в одной папке.

Мой сервер: импорт потоковой передачи импорт веб-браузера импорт ОС из wsgiref.simple_server импорт make_server

FILE = 'index.html'
PORT = 8000

def test_app(environ, start_response):

    if environ['REQUEST_METHOD'] == 'POST':

        try:
            request_body_size = int(environ['CONTENT_LENGTH'])
            request_body = environ['wsgi.input'].read(request_body_size)
        except (TypeError, ValueError):
            request_body = "0"

        try:
            response_body = str(int(request_body) ** 2)
        except:
            response_body = "error"

        status = '200 OK'
        headers = [('Content-type', 'text/plain')]
        start_response(status, headers)
        return [response_body]

    else:
        f = environ['PATH_INFO'].split( "?" )[0]
        f = f[1:len(f)]
        response_body = open(f).read()
        status = '200 OK'
        headers = [('Content-type', 'text/html'), ('Content-Length', str(len(response_body)))]
        start_response(status, headers)
        return [response_body]

def open_browser():
    """Start a browser after waiting for half a second."""

    def _open_browser():
        webbrowser.open('http://localhost:%s/%s' % (PORT, FILE))
        thread = threading.Timer(0.5, _open_browser)
        thread.start()

def start_server():
    """Start the server."""
    httpd = make_server("", PORT, test_app)
    httpd.serve_forever()


if __name__ == "__main__":
    open_browser()
    print "Now serving on Port 8000"
    start_server()

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


Ответы (4)


Вы не звоните start_response. Используйте такой вызов:

start_response("200 OK", [('Content-type','text/plain')])
person Matthew Flaschen    schedule 01.03.2011
comment
Спасибо. Это работает, если я обслуживаю свою страницу, я запускаю сценарий, затем набираю localhost: 8000 в моем браузере, но он не работает, когда я запускаю поддельный сервер wsgi, затем запускаю свою html-страницу в браузере и щелкаю ссылку. Я все еще получаю ошибку. Может быть, проблема в моем сервере (см. Вопрос для сервера)? - person Mack; 01.03.2011
comment
Где? Или этот ответ устарел? Я вижу start_response() в приведенных выше фрагментах кода, поэтому я не уверен, что вы предлагаете. - person dwanderson; 14.01.2015
comment
@dwanderson Он отредактировал свой вопрос после того, как ему помог мой ответ. См. stackoverflow.com/posts/5150339/revisions. - person Matthew Flaschen; 15.01.2015

Ошибка, похоже, из-за скрипта Python. Проверьте, подходит ли aaa.py к прямому доступу через ваш IE или другие браузеры.

person Kardel    schedule 01.03.2011
comment
Из ответа @Matthew Flaschen скрипт python работает, когда я запускаю его, затем набираю http ...: 8000, поэтому я думаю, что скрипт в порядке, но я не уверен, что мне нужно что-то обслуживать? - person Mack; 01.03.2011
comment
кажется немного запутанным, и я предлагаю вам использовать firefox с firebug для мониторинга сети после того, как вы щелкнете якорь в test.html. Теперь вы используете метод «POST» для загрузки данных, не могли бы вы вместо этого использовать «GET»? - person Kardel; 02.03.2011

httpd.serve_forever ()

должен находиться вне функционального блока

person Asher    schedule 26.04.2012

Здесь нельзя использовать "aaa.py" в качестве URL-адреса сообщения. Затем сервер будет искать этот файл в корне. например локальный хост / aaa.py. Вы должны указать полный путь от корня сервера (без корневого пути сервера)

например если файл находится на /var/www/wsgi-scripts/aaaa.py, тогда URL-адрес должен быть /wsgi-scripts/aaaa.py.

person Chamith Malinda    schedule 16.01.2013