2011-03-01 22 views
4

我想有一个网页,你点击一个按钮,通过使用AJAX我从一个Python脚本的字符串,然后显示在一段HTML元素的字符串。是否可以使用Python,AJAX和CGI一起

我知道我可以使用Python做到这一点,WSGI & AJAX(理论上我能做到这样),但其waaaay太困难了。我对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> 
+0

为什么你不能使用适当的python webframework - 一些东西像Pyramid/Pylons那么简单... CGI是90多岁和过时的....所以为什么要使用CGI? – 2011-03-01 05:20:26

回答

4

当然你可以使用普通的旧CGI如果你想要。你的代码适合我。 (该链接被点击时“ABCDEF”变成了“你好”。)

您必须在您安装一些简单的错误。我会检查你的测试脚本(a + rx)的文件权限,这可能会被忽略。另外我还假设你在cgi脚本的顶部有一个“#!/ usr/bin/env python”(或者等效的东西)(在你的例子中省略了它)。

5

这里有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)  
+0

不错!这帮助我调试了我的代码中的类似问题 – 2013-01-02 20:15:04

0

退房Sajax的:

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

有一个Python库和示例的下载。您可以拥有一个可处理您的视图并实现任何AJAX调用的CGI脚本。

相关问题