从javascript中调用python脚本的参数时出错

时间:2014-08-12 00:35:56

标签: javascript python ajax json

我有一个AJAX函数来发送参数并从python脚本中检索一些json对象。我尝试将输入文本中的值发送到脚本

AJAX代码

function ajax_get_json(){
    var results = document.getElementById("results");
    var hr = new XMLHttpRequest();
    var tipo = document.getElementById('tipo').value;
    var atributo = " " +tipo;
    document.getElementById('texto').innerHTML = atributo;
    hr.open("GET", "prov1.py", + atributo, true);
    hr.responseType = "JSON";
    hr.setRequestHeader("Content-Type", "application/json", true);
    hr.onreadystatechange = function() {
            if(hr.readyState == 4 && hr.status == 200) {
                    var data = JSON.parse(hr.responseText);
                        results.innerHTML = "";
                        for(var obj in data){
                                results.innerHTML +="<tr><td>"+ data[obj].id+"</td><td>"+data[obj].nombre+"</td><td>"+data[obj].tipo+"</td></tr>";
                        }
            }
    }
    hr.send(null);
    results.innerHTML = "requesting...";
}

我的python脚本就是这个

#!/usr/local/bin/python2.7
import sys
import cx_Oracle
import json
import cgi
import cgitb
cgitb.enable()

form = cgi.FieldStorage()
tipo = form.getvalue('tipo')

#print "Content-Type: text/html; charset=utf-8\n\n";
print "Status: 200 OK"
print "Content-type: application/json\n";
#print
lst_proveedores=[]
conn_str = 'user/pass@database'
conn = cx_Oracle.connect(conn_str)
c = conn.cursor()
c.execute(""" select id_proveedor, nombre, tipo from mpc_proveedores where tipo = '%s' """ %tipo)
for row in c:
    record1 = {"id":row[0], "nombre":row[1], "tipo":row[2]}
    lst_proveedores.append(record1)
json_string = json.dumps(lst_proveedores)
print json_string
conn.close()

在命令行中,脚本工作正常(python prov1.py tipo = MMS)并从数据库中检索数据,但是当我尝试从AJAX检索数据时,脚本会向我发送一个空的json对象。使用firebug我检查响应,只显示[]。

我认为AJAX函数有一些错误,因为看起来发送参数为空(python prov1 tipo =)。 我是AJAX的新手,不确定我是不是在AJAX中使用了正确的函数,还是在python脚本中。 如果有人知道更好的方法来检索数据,请告诉我

请帮助!!!!

1 个答案:

答案 0 :(得分:0)

夫妻俩:

  1. 更改
    var atributo = " " +tipo;

    var atributo = "?tipo=" + encodeURIComponent(tipo);
  2. 您应该检查SQL injection vulnerabilities
  3. 的代码
  4. 当您向服务器发出请求时,即使您没有请求正文,也会发送Content-Type标头。 (GET请求永远不会有请求主体。)不会破坏任何东西,但你应该把它拿出来。
  5. responseType是HTML5的一部分,is not availible in all browsers
  6. 祝你好运!