ajax 一旦将中间数据通过管道传输到后端的 python,就会得到空的 responseText
ajax gets empty responseText once piping intermediate data to python at backend
背景是,前端将一个id返回给后端,后端使用该id从数据库中提取信息。提取的数据需要在后端进一步处理,然后发送回前端。
前端代码如下:
html:
<!DOCTYPE html>
<html>
<head>
<title>Test!</title>
<meta charset="utf-8">
<script src="loadPage.js">
</script>
</head>
<body onload = "loadPage()">
<div id="stack"><p>test part</p>
</div>
</body>
</html>
js:
function __getParameters() {
var parm = {};
var url = window.location.href;
var pairs = url.slice(url.indexOf('?') + 1).split('&');
for (var i = 0; i < pairs.length; i++) {
pair = pairs[i].split('=');
parm[pair[0]] = pair[1];
}
return parm;
}
function __loadData(star) {
var xmlhttp;
if (window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
} else {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
// var data = JSON.parse(xmlhttp.responseText);
console.log(xmlhttp.responseText);
if (xmlhttp.responseText == "") {
document.getElementById("stack").innerHTML = "f*ck";
} else {
document.getElementById("stack").innerHTML = xmlhttp.responseText;
}
}
}
var url = "getXML.pl";
url = url + "?STAR=" + star;
xmlhttp.open("GET", url, true);
xmlhttp.send();
}
function loadPage() {
var parm = __getParameters();
// document.getElementById("stack").innerHTML = parm["STAR"];
if (parm == undefined) {
// wrong url error page
} else if (parm['STAR'] == undefined) {
// missing star error page
} else if (parm['user' == undefined]) {
// missing user id error page
} else {
var star = parm["STAR"];
var user = parm["user"];
__loadData(star);
}
}
后端使用 perl 从数据库中提取数据,并将输出打印到标准输出。输出是字符串形式的 XML 。然后我必须使用现有的 python 脚本来处理提取的数据。
不过服务器好像不支持python(不过服务器可以运行python如果我直接运行python脚本就可以了。我的声明的原因是我写了一个 python cgi 并且我得到了一个 500 错误,而 perl cgi 是好的。我确定 python 脚本是正确的,因为它可以 运行直接在服务器上。我无法访问错误日志,也无法修改服务器的配置文件)。
所以我将 perl 脚本的输出通过管道传输到 python,然后 运行 使用 'system()'。 python 脚本将处理后的字符串输出到标准输出。
这是后端脚本:
perl 脚本:
#!/depot/perl-5.14.2/bin/perl
# extract posted data
local ($buffer, @pairs, $pair, $name, $value, %FORM);
$ENV{"REQUEST__METHOD"} =~ tr/a-z/A-Z/;
if ($ENV{"REQUEST_METHOD"} eq "POST") {
read(STDIN, $buffer, $ENV{"CONTENT_LENGTH"});
} else {
$buffer = $ENV{"QUERY_STRING"};
}
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $buffer);
$value =~ tr/+/ /;
$value =~ s/%(..)/pack("C", hex())/eg;
$FORM{$name} = $value;
}
$star = $FORM{STAR};
print "Content-type:text/html\n\n";
my $cmd = "***/sq_star.pl --xml --star_id " . $star;
$cmd = $cmd . " | ***/python parseXML.py";
system($cmd);
Perl 脚本末尾的 sq_star.pl(我只是删除了此处的路径并将其替换为 ***)只是一个将从数据库中提取数据的现有脚本。 parseXML.py 是一个现有的脚本,它对输入字符串有很多作用。
奇怪的是,responseText 始终是一个空字符串。我试过直接在服务器上运行 perl 脚本,它可以打印出预期的结果。如果我删除 $cmd = $cmd . " | ***/python parseXML.py";
,responseText 将是从数据库中提取的数据。
我目前尝试过的:
1.我写了一个简单的测试python,只打印了一行。仍然是空响应
2. 我试图在 perl 脚本中将输出存储为 $output =`$cmd`;
和 print $output;
,但仍然是空的。
3.我尝试将原始数据存入一个txt,让python从txt中读取。还是空的
看来python处理的数据就是传不回来.....
--------------------更新----------------
好像是服务器的问题。我猜服务器未设置为支持 python 所以如果我直接向后端的 python 脚本发送请求,将会出现 500 错误。但不知何故,我的方式,即在 perl 中调用 python,绕过错误,但 python 仍然不起作用......只是我的猜测
我发现了问题。是因为服务器找不到我指定的解释器。 system(...) 行实际上根本没有 运行 。我没有看到任何错误的原因是 system() 为我隐藏了错误。实际上 system() 的 return 值为-1,这意味着有问题。我应该检查 return 值
背景是,前端将一个id返回给后端,后端使用该id从数据库中提取信息。提取的数据需要在后端进一步处理,然后发送回前端。
前端代码如下:
html:
<!DOCTYPE html>
<html>
<head>
<title>Test!</title>
<meta charset="utf-8">
<script src="loadPage.js">
</script>
</head>
<body onload = "loadPage()">
<div id="stack"><p>test part</p>
</div>
</body>
</html>
js:
function __getParameters() {
var parm = {};
var url = window.location.href;
var pairs = url.slice(url.indexOf('?') + 1).split('&');
for (var i = 0; i < pairs.length; i++) {
pair = pairs[i].split('=');
parm[pair[0]] = pair[1];
}
return parm;
}
function __loadData(star) {
var xmlhttp;
if (window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
} else {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
// var data = JSON.parse(xmlhttp.responseText);
console.log(xmlhttp.responseText);
if (xmlhttp.responseText == "") {
document.getElementById("stack").innerHTML = "f*ck";
} else {
document.getElementById("stack").innerHTML = xmlhttp.responseText;
}
}
}
var url = "getXML.pl";
url = url + "?STAR=" + star;
xmlhttp.open("GET", url, true);
xmlhttp.send();
}
function loadPage() {
var parm = __getParameters();
// document.getElementById("stack").innerHTML = parm["STAR"];
if (parm == undefined) {
// wrong url error page
} else if (parm['STAR'] == undefined) {
// missing star error page
} else if (parm['user' == undefined]) {
// missing user id error page
} else {
var star = parm["STAR"];
var user = parm["user"];
__loadData(star);
}
}
后端使用 perl 从数据库中提取数据,并将输出打印到标准输出。输出是字符串形式的 XML 。然后我必须使用现有的 python 脚本来处理提取的数据。
不过服务器好像不支持python(不过服务器可以运行python如果我直接运行python脚本就可以了。我的声明的原因是我写了一个 python cgi 并且我得到了一个 500 错误,而 perl cgi 是好的。我确定 python 脚本是正确的,因为它可以 运行直接在服务器上。我无法访问错误日志,也无法修改服务器的配置文件)。
所以我将 perl 脚本的输出通过管道传输到 python,然后 运行 使用 'system()'。 python 脚本将处理后的字符串输出到标准输出。
这是后端脚本:
perl 脚本:
#!/depot/perl-5.14.2/bin/perl
# extract posted data
local ($buffer, @pairs, $pair, $name, $value, %FORM);
$ENV{"REQUEST__METHOD"} =~ tr/a-z/A-Z/;
if ($ENV{"REQUEST_METHOD"} eq "POST") {
read(STDIN, $buffer, $ENV{"CONTENT_LENGTH"});
} else {
$buffer = $ENV{"QUERY_STRING"};
}
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $buffer);
$value =~ tr/+/ /;
$value =~ s/%(..)/pack("C", hex())/eg;
$FORM{$name} = $value;
}
$star = $FORM{STAR};
print "Content-type:text/html\n\n";
my $cmd = "***/sq_star.pl --xml --star_id " . $star;
$cmd = $cmd . " | ***/python parseXML.py";
system($cmd);
Perl 脚本末尾的 sq_star.pl(我只是删除了此处的路径并将其替换为 ***)只是一个将从数据库中提取数据的现有脚本。 parseXML.py 是一个现有的脚本,它对输入字符串有很多作用。
奇怪的是,responseText 始终是一个空字符串。我试过直接在服务器上运行 perl 脚本,它可以打印出预期的结果。如果我删除 $cmd = $cmd . " | ***/python parseXML.py";
,responseText 将是从数据库中提取的数据。
我目前尝试过的:
1.我写了一个简单的测试python,只打印了一行。仍然是空响应
2. 我试图在 perl 脚本中将输出存储为 $output =`$cmd`;
和 print $output;
,但仍然是空的。
3.我尝试将原始数据存入一个txt,让python从txt中读取。还是空的
看来python处理的数据就是传不回来.....
--------------------更新----------------
好像是服务器的问题。我猜服务器未设置为支持 python 所以如果我直接向后端的 python 脚本发送请求,将会出现 500 错误。但不知何故,我的方式,即在 perl 中调用 python,绕过错误,但 python 仍然不起作用......只是我的猜测
我发现了问题。是因为服务器找不到我指定的解释器。 system(...) 行实际上根本没有 运行 。我没有看到任何错误的原因是 system() 为我隐藏了错误。实际上 system() 的 return 值为-1,这意味着有问题。我应该检查 return 值