背景是,我有一个芹菜分布式作业服务器,配置了一个Django视图,该视图返回JSON中正在运行的作业的状态。作业服务器位于celleryserver.mydomain.com,我正在从中执行jQuery的页面是www.mydomain.com,因此我不需要考虑JSONP,因为请求不是针对不同的域的,所以我应该考虑JSONP?
通过查看服务器日志,我发现jQuery每3秒执行一次getJSON
调用(使用Javascript setInterval)。它似乎确实使用了一个选项请求,但是我已经用curl
确认了对于这些请求类型仍然返回JSON。
问题是,下面jQuery中的console.log()
Firebug调用似乎从未运行过!getJSON调用之前的那个。没有回拨工作对我来说是个问题,因为我希望用这种方式来调查芹菜的工作状态,并根据工作状态来做各种事情。
<script type="text/javascript">
var job_id = 'a8f25420-1faf-4084-bf45-fe3f82200ccb';
// wait for the DOM to be loaded then start polling for conversion status
$(document).ready(function() {
var getConvertStatus = function(){
console.log('getting some status');
$.getJSON("https://celeryserver.mydomain.com/done/" + job_id,
function(data){
console.log('callback works');
});
}
setInterval(getConvertStatus, 3000);
});
</script>
我使用curl
来确定从服务器接收到的内容:
$ curl -D - -k -X GET https://celeryserver.mydomain.com/done/a8f25420-1faf-4084-bf45-fe3f82200ccb
HTTP/1.1 200 OK
Server: nginx/0.6.35
Date: Mon, 27 Jul 2009 06:08:42 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Connection: close
{"task": {"executed": true, "id": "a8f25420-1faf-4084-bf45-fe3f82200ccb"}}
JSON在我看来很好,JSONlint.com现在可以为我验证它。。。我还用-X OPTION
模拟了jQuery查询,并从服务器获得了与GET(application/json等的内容类型)完全相同的数据
我已经盯着这个看了很多年了,非常感谢你的帮助。我是一个非常新的jQuery用户,但这看起来应该是非常没有问题的,所以我不知道我做错了什么!
正如一些人所说,子域算作域,我有一个跨域问题:)
我通过创建一个Django中间件来解决这个问题,如果视图返回JSON并且请求附加了一个回调,那么该中间件将从我的视图中更改响应。
现在一切都按计划进行。谢谢!
我认为你有一个跨子域的问题,
sub.domain.tld
和domain.ltd
不一样。我建议您安装Firebug,并检查您的代码在请求启动时是否抛出了Permission denied异常,如果是这样,请转到JSONP。。。
将url更改为以下内容:
“https://celeryserver.mydomain.com/done/”+作业id+”?回调=?“
然后在你的django视图上,结果应该是:
…可能有很多方法可以完成最后一行,但是 基本上读入回调参数(或者随意命名)
然后将其返回为调用json对象 (jQuery负责创建回调函数(它替换“?”使用生成的函数)
相关问题 更多 >
编程相关推荐