背景是我有一个配置了Django视图的芹菜分布式作业服务器,它返回JSON中正在运行的作业的状态。作业服务器位于celeryserver.mydomain.com,我正在执行jQuery的页面是www.mydomain.com所以我不需要考虑JSONP,因为请求不是不同的域名?
观察我的服务器日志我看到jQuery每3秒执行一次getJSON
调用(使用Javascript setInterval)。它似乎确实使用了一个OPTION请求,但我已经确认使用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完全相同的数据(内容-type of application / json等。)
我已经多年盯着这个,任何帮助都非常感激。我是一个非常新的jQuery用户,但这似乎应该是非常没有问题的,所以我不知道我做错了什么!
答案 0 :(得分:3)
我认为您遇到了跨子域问题,sub.domain.tld
和domain.ltd
不一样。
我建议您安装Firebug并检查您的代码是否在请求启动时抛出 Permission denied 异常,如果是这种情况,请转到JSONP ......
答案 1 :(得分:1)
将您的网址更改为:
“https://celeryserver.mydomain.com/done/”+ job_id +“?callback =?”
然后在您的django视图结果上应该有以下效果:
'{callback}({json})'.format(callback=request.GET['callback'], json=MyJSON)
......可能有很多方法可以做到最后一行,但是 基本上读回调参数(或任意你想要的名字)
然后将其作为调用json对象返回 (jQuery负责创建一个回调函数(它用生成的函数替换'?')
答案 2 :(得分:1)
正如有几个人所说的那样,子域名被视为域名,我遇到了跨域问题:)
我通过创建一个Django中间件来解决它,如果他们返回JSON并且请求附加了回调,则会更改我的视图中的响应。
class JSONPMiddleware:
def process_response(self, request, response):
ctype = response.get('content-type', None)
cback = request.GET.get('callback', None)
if ctype == 'application/json' and cback:
jsonp = '{callback}({json})'.format(callback=cback, json=response.content)
return HttpResponse(content=jsonp, mimetype='application/javascript')
return response
现在所有人都按计划工作了。谢谢!
答案 3 :(得分:0)
您是从其他域获取JSON吗?如果是这样,您很可能遇到跨域问题。您需要使用JSONP。 jQuery会自动执行此操作,但服务器需要知道这一点。
请参阅: