[英]Accessing fields with Python CGI FieldStorage from a JQuery AJAX call
我寫了一些JQuery,可以對Python腳本進行ajax調用。 我已經成功地在字符串之間來回傳遞了字符串,但是我從CGI FieldStorage對象中獲得了奇怪的行為,該對象用於獲取Python腳本中的輸入。 我還設法發送了一個具有鍵/值對的簡單對象,如下所示:
deptObj = { one : '1', two : '2'};
$.ajax({
data: deptObj,
url: "simple.py",
success: function(result) { console.log("Success!"); console.log(result); },
error: function(request, error) { console.log("Error"); console.log(request); }
});
這是我的python腳本simple.py:
#!/usr/bin/env python
import json
import cgi
import cgitb
print "Content-type: application/json\n\n"
cgitb.enable() # display error messages in web browser
fs = cgi.FieldStorage()
print json.dumps(fs.keys())
當我運行JavaScript時,它會正確打印出對象中的鍵,即["two", "one"]
(我不確定為什么它們會被反向)。 我還可以通過將simple.py的最后一行替換為print json.dumps(fs["one"].value)
來獲取相應的值。
但是,當我嘗試制作一個多級對象(一個對象中的一個對象)時,我會感到奇怪。 例如,我保留了已經創建的deptObj,然后將data: { departments: deptObj}
傳遞給ajax調用。 然后,當我告訴simple.py打印出鍵時,結果是["departments[two]", "departments[one]"]
而不是我期望的["departments"]
。 然后,由於“部門”顯然不是鍵,因此當我嘗試print json.dumps(fs["departments"].value)
,卻出現了print json.dumps(fs["departments[one]"].value)
,而同時print json.dumps(fs["departments[one]"].value)
給我的結果是1。
根據FieldStorage的文檔 ,“通過form [key]訪問的字段本身就是FieldStorage的實例”,因此我認為FieldStorage對象將具有一個“部門”鍵,其值是另一個包含鍵“ one”的FieldStorage對象。 ”和“兩個”。 但是,這似乎並不正確。 如何形成一個多級Javascript對象並使用FieldStorage在我的python腳本中訪問它?
這只是jQuery是愚蠢的。 您應該在$.ajax
調用中將traditional: true
設置為traditional: true
。
這不會嚴格回答您的問題,但我希望它能回答目標而不是您提出的具體問題。 抱歉,這不是您想要的。
jQuery傳遞Ajax請求,其內容類型(默認情況下)為application/x-www-form-urlencoded; charset=UTF-8
application/x-www-form-urlencoded; charset=UTF-8
(摘自jQuery(v1.0及更高版本)文檔 )。
有幾種方法可以從JavaScript將JSON導入python腳本。 首先是顯式地創建一個表單字段,並傳入“字符串化” JSON結構,然后可以在另一端進行解析。 另一個方法是嘗試反向工程化jQuery如何編碼JSON字符串,然后將編碼后的字段分離成JSON字符串(聽起來很痛苦)。
(在我看來)有一種更好的方法,可以通過在Ajax查詢中將內容類型指定為JSON來立即將內容類型作為JSON傳遞。 例如,將您的jQuery Ajax調用更改為:
deptObj = { one : '1', two : '2'};
$.ajax({
data: deptObj,
type: "POST",
url: "simple.py",
dataType : "json",
success: function(result) { console.log("Success!"); console.log(result); },
error: function(request, error) { console.log("Error"); console.log(request); }
});
(即,將type
添加到'POST'
並將dataType
添加到'json'
)。 以及相應的Python代碼:
#!/usr/bin/env python
import json
import sys
import cgi
import cgitb
cgitb.enable() # display error messages in web browser
print "Content-type: application/json\n\n"
print json.dumps( json.load( sys.stdin ) )
產生了我認為是您想要的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.