2011-03-01 50 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腳本。

相關問題