Можно ли использовать Python, AJAX и CGI вместе? - PullRequest
4 голосов
/ 01 марта 2011

Мне нужна веб-страница, на которой вы нажимаете кнопку, используя AJAX, я получаю строку из скрипта Python, а затем отображаю эту строку в элементе HTML абзаца.

Я знаю, что могу сделать это, используя Python, WSGI & AJAX (теоретически я могу сделать это таким образом), но это слишком сложно. У меня есть опыт работы с CGI и python.

Так могу ли я сделать выше, используя CGI?

Если я могу, как работает скрипт Python, точно так же, как при обслуживании страницы с использованием CGI?

Это не работает:

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


print "Content-Type: text/html\n"

input_data   = cgi.FieldStorage()
print "hello"

Когда я нажимаю кнопку на своей странице, ничего не происходит, и мой CGI-сервер (который отлично работает для запросов cgi-страницы) выдает мне ошибку http 501.

Мой 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 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>

Ответы [ 4 ]

5 голосов
/ 29 июня 2011

Вот 3 файла [my.html, myCGI.py, myPyServer.py]. В Windows XP я помещаю их все в одну директорию и дважды щелкаю на myPyServer.py, и все работает очень хорошо.

my.html такой же, как ваш html, за исключением:

yours: <a href="javascript:onTest('aaa.py', '')">Click it</a>
mine:  <a href="javascript:onTest('/myCGI.py', 'x=7')">Click it</a>

myCGI.py очень близок к вашему

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

input_data  = cgi.FieldStorage()
if input_data:
    print "Content-Type: text/html\n"
    print "hello"
else:
    f = open('my.html', 'r'); s = f.read(); f.close()
    print "Content-Type: text/html\n"
    print s

myPyServer.py

import CGIHTTPServer
import BaseHTTPServer
import sys

class Handler(CGIHTTPServer.CGIHTTPRequestHandler):
    cgi_directories = ["/"]         #make sure this is where you want it. [was "/cgi"]

PORT = 8000

httpd = BaseHTTPServer.HTTPServer(("", PORT), Handler)

# see effbot http://effbot.org/librarybook/thread.htm
def runserver():
    print "serving at port", PORT
    httpd.serve_forever()

import thread
thread.start_new_thread(runserver, ())

print "opening browser"

import webbrowser  
url = 'http://127.0.0.1:8000/myCGI.py'
webbrowser.open_new(url)

quit = 'n'
while not(quit=='quit'):
    quit = raw_input('\n ***Type "quit" and hit return to exit myPyServer.*** \n\n') 


print "myPyServer will now exit."

sys.exit(0)    
4 голосов
/ 01 марта 2011

Конечно, вы можете использовать старый добрый CGI, если хотите. Ваш код работает нормально для меня. (При нажатии на ссылку «abcdef» превращается в «привет».)

У вас должна быть простая ошибка в настройке. Я бы проверил права доступа к файлам в ваших тестовых скриптах (a + rx), которые могли быть пропущены. Также я предполагаю, что у вас есть «#! / Usr / bin / env python» (или эквивалентный) в верхней части вашего скрипта cgi (это опущено в вашем примере выше).

0 голосов
/ 27 февраля 2014

Вот один простой пример использования Python CGI и ajax.http://www.ssiddique.info/writing-your-first-python-cgi-ajax-script.html

0 голосов
/ 24 января 2013

Проверьте sajax:

http://www.modernmethod.com/sajax/

В библиотеке есть библиотека python и пример.У вас может быть один сценарий CGI, который может обрабатывать ваше представление и реализовывать любой вызов AJAX.

...