簡體   English   中英

通過JQuery AJAX調用使用Python CGI FieldStorage訪問字段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM