2013-02-21 31 views
3

我正在嘗試讓Python,cgi模塊,ajax/javascript組合工作。由於我的服務器訪問(本質上是租用的Web空間)的本質,我不能安裝像Django或任何其他Web框架的東西。我現在堅持使用CGI。我可以調用python文件來簡單地打印出一些東西,但是一旦將參數傳遞給python文件,cgi.FieldStorage()就不會收到任何輸入。當我爲FieldStorage添加打印語句時,輸出如下:Python/CGI/Ajax:cgi.FieldStorage沒有收到參數

FieldStorage(None, None, []) 

您可以在下面找到所有必需的代碼。從本質上講,我試圖做的(用於測試目的)是從文本輸入中獲取一個字符串,在其末尾添加一個「1」並將其返回。有趣的是,當我使用一個簡單的php文件來完成同樣的事情,並在其他完全相同的腳本中使用它時,腳本沒有任何問題。下面是我嘗試了典型的PHP腳本:

<?php 
$user = urldecode(implode(file('php://input'))); 
$adj_user = $user . "1"; 
echo $adj_user; 
?> 

(請注意,我想使用Python,因爲我更舒服,我不喜歡PHP不少)

我有感覺我只是有點密集,而且它非常簡單。非常感謝任何幫助找到我做錯了什麼。提前感謝!

P.S.在我發佈這裏之前,我已經搜索了很多stackoverflow和web。有很多相關的話題,但沒有什麼比我所問的(看似)簡單。如果有這個問題的答案重複,那麼我表示歉意,並希望有一個鏈接。再次感謝。

回溯是:

Traceback (most recent call last): 
    File "/home/www/xxxxx/html/cgi-bin/hello.py", line 14, in &lt;module&gt; 
    adj_user = form['user'] + "1" 
    File "/usr/lib/python2.5/cgi.py", line 567, in __getitem__ 
    raise KeyError, key 
KeyError: 'user' 

這裏是 「index.html的」

<!DOCTYPE html> 
<html> 
    <head> 
    <title>Report</title> 
    <script type='text/javascript' src='test.js'></script> 
    </head> 
    <body> 
    <form method="post" action=""> 

    <p>Please enter your name here: 
    <input type="text" name="user"> 

    <input type="submit" name="submit" value="Submit" onClick="return hello(this.form.user.value);"> 
    </p> 

    </form> 
    </body> 
</html> 

這是 「test.js」 文件:

function hello(user) { 
    // Mozilla version 
    if (window.XMLHttpRequest) { 
     xhr = new XMLHttpRequest(); 
    } 
// IE version 
    else if (window.ActiveXObject) { 
     xhr = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    //user=encodeURIComponent(user); 
    xhr.open("POST", "../cgi-bin/hello.py"); 
    xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8'); 
    xhr.send(user); 

    xhr.onreadystatechange=function() { 
     if (xhr.readyState===4) { 
      adj_user = xhr.responseText; 
      alert ("Hello " + adj_user); 
     } 
    } 
    return false; 
} 

,最後「 hello.py「在我的服務器的cgi-bin中

#!/usr/bin/env python 
# -*- coding: UTF-8 -*- 

import cgi 
form = cgi.FieldStorage() 

# enable debugging 
import cgitb 
cgitb.enable() 

print "Content-Type: text/html;charset=utf-8" 
print 

adj_user = form['user'] + "1" 
print adj_user 

編輯

我取得了一些進展,但它仍然是不是我希望的。我改變了以下塊如下:

xhr.open("GET", "../cgi-bin/hello.py?user=" + user, true); 
    xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8'); 
    xhr.send(); 

請注意,從POST「‘用戶=?’+用戶」的變化GET和後綴,以及在發送清除「用戶」的說法() 方法。

現在,這是,我想要的,但它不應該「那樣」。必須有一種方法來獲得這種經典的方式...

像往常一樣,任何嘗試或建議是值得歡迎的。我真的不知道還有什麼要嘗試。謝謝你。

回答

3

application/x-www-form-urlencoded數據的格式是:

key=value&key2=value2 

...,其中鍵和值是URL編碼。

您只發布字段的值,沒有鍵。

var postData = encodeURIComponent('user') + '=' + encodeURIComponent(user); 
xhr.send(postData); 

的原因是,PHP代碼是工作了,因爲你正在閱讀的原始POST數據,而不是$_POST['user'](這是你的Python相當於)。您需要訪問form['user'].value而不是form['user']。這將返回str,因此無法將其與+ 1級聯,而無需執行類型轉換。

+0

非常感謝您的回答!不幸的是,我不太明白你的意思,我不能讓我的代碼與你寫的東西一起工作。 (我只是用我的代碼中的行與'postData'變量減去未關閉的''等) 你可能會寫出代碼塊給我。對於ajax我還是比較新的,所以請忍受我。謝謝! – Nebelhom 2013-02-23 12:10:08

+0

在JavaScript方面,只需用上面兩行代替發送行即可。我也發現了Python方面的問題,並且已經更新了答案。 – Quentin 2013-02-23 12:31:10

+0

謝謝,夥計。那樣做了。它仍然沒有我希望的那麼有活力。我仍然需要爲每個傳遞的變量寫出一個「encodeURIComponent('key')+'='+ encodeURIComponent(key)」的代碼塊,如果你有3個或更多的變量,它會變得很長,但是我會標記你的答案已被接受。感謝隊友,你是明星! 一旦我可以(22小時顯然),我會給你+50給你,當然,除非有人想出一個動態的輸入密鑰的方式。 – Nebelhom 2013-02-23 13:29:42