【发布时间】:2023-03-08 09:36:01
【问题描述】:
我有一个像这样的 ajax 调用;
$.ajax({
type : 'GET',
url: 'url',
data: 'data='+data,
success: function(configOut) {
alert(configOut);
},
error: function(configOut) {
alert(configOut);
}
});
被调用的视图会这样做:
command = ['python', 'autoDeploy.py']
p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
out = p.stdout.read()
rv = p.wait()
if rv:
status = 400
else:
status = 200
return HttpResponse(out, content_type="text/plain", status=status)
在调试器中我可以看到我正在返回这个:
(Pdb) print HttpResponse(out, content_type="text/plain", status=status)
Content-Type: text/plain
Invalid file format. Format is: "Toolname,Type,IPaddress,login,pw"
但在我的成功或错误函数中,我似乎无法访问该文本。 configOut 有:
Object {readyState: 0, setRequestHeader: function, getAllResponseHeaders: function, getResponseHeader: function, overrideMimeType: function…}
我如何获得正在返回的文本?
我刚刚注意到的是,在 Chrome 开发人员工具中,在此请求的网络选项卡中,在状态/文本列中显示“(已取消)” - 不确定这是什么意思。如果我从浏览器运行相同的请求,我会得到响应。
我对此进行了进一步调试,发现在服务器端我收到“错误:(32,'Broken pipe')'谷歌搜索显示这是因为浏览器已经移动,所以没有任何东西可以接收到响应.我尝试将超时设置为一个较大的值,但没有任何乐趣。我怎样才能防止这种情况?似乎不可能从浏览器发出同步请求。
【问题讨论】:
-
检查“out”变量是否包含任何文本...而且,据我所知,您在使用 http 响应时必须提供文本长度。 (我的意思是 CONTENT_LENGTH 标题)
-
是的 - 在我的示例中它具有“无效的文件格式”。格式为:“Toolname,Type,IPaddress,login,pw”' 我没有看到任何关于在文档中提供长度的信息 (docs.djangoproject.com/en/1.5/ref/request-response/…)
-
啊..所以你的问题不在于发送响应。我认为您的问题出在 autoDeploy.py - 因为您使用 python 启动此文件,并尝试读取输出。这意味着您会从脚本“autoDeploy.py”中获得文本“工具名、类型、IP地址、登录名、密码”。
-
是的,autoDeploy.py 脚本将该输出发送回视图中的代码,然后我想将其作为请求响应发送回。视图中的代码获取输出,并且正在发送它。问题似乎是浏览器没有等待它。请参阅我修改后的帖子。
-
如果你在浏览器中将url写入地址栏(不使用ajax,只需手动写入url),-浏览器得到什么响应?