Cherrypy/JQuery 跨域资源共享问题

3

我有一个基于Cherrypy的简单Python Web服务器。 它的资源应该提供API。 服务器有以下代码来提供CORS:

def CORS():
    cherrypy.response.headers["Access-Control-Allow-Origin"] = "*"

if __name__ == "__main__":
    cherrypy.tools.CORS = cherrypy.Tool('before_finalize', CORS)
    cherrypy.quickstart(PyCachedAdmin(), config={'/': {'request.dispatch': cherrypy.dispatch.MethodDispatcher()}})

服务器正在本地主机的8080端口上运行。现在我有一个HTML文件,在本地主机上可用(默认端口80),该文件加载了jquery 1.9。我打开浏览器控制台尝试使用$.ajax执行任何AJAX请求到cherrypy服务器。我一直在尝试:

$.ajax({
  url:'http://localhost:8080/',
  type: "POST",
  dataType: "json",
  data: {command:"version"}
}).done(function(){
  console.log('hej');
});

并且

$.ajax({
  url:'http://localhost:8080/',
  type: "POST",
  crossDomain: true,
  dataType: "jsonp",
  data: {command:"version"}
}).done(function(){
  console.log('hej');
});

并且

$.support.cors = true

什么都试过了,但是都没有用。当使用jsonp时,我要么得到XMLHttpRequest cannot load http://localhost:8080/. Origin http://localhost is not allowed by Access-Control-Allow-Origin.,要么得到GET http://localhost:8080/?callback=jQuery19102827550224028528_1382823727186&command=version&_=1382823727187 404 (Not Found)(它神秘地发送GET而不是POST)。周围有一些类似的问题,我尝试了它们,但结果还是出现问题。

PS:服务器完全正常,因为所有的curl测试都通过了。跨域问题出在哪里还是有问题。


什么是“浏览器”? - Kevin B
它是Chrome 27.0.1453.93。 - ducin
1
crossDomain: true和$.support.cors = true绝对不是必需的,除非您的服务器返回jsonp(此时您不需要cors)。如果您的服务器不返回jsonp,则不需要使用jsonp。此外,无法使用POST jsonp请求,因为jsonp是使用脚本标记而不是xhr发送的。您的第一个片段是正确的。您能否发布正在发送的请求和响应标头?(Chrome控制台) - Kevin B
@KevinB 但是当我执行 $.ajax({ url:'http://localhost:8080/', type: "POST", data: {command:"version"} }).done(function(){ console.log('hej'); }); 时,我收到了错误信息:XMLHttpRequest无法加载http://localhost:8080/。来源http://localhost不被Access-Control-Allow-Origin允许。 - ducin
但是,进行任何这些更改都不会改变结果。你的JavaScript没问题。问题更可能是浏览器权限(非常不可能)或服务器没有正确处理CORS请求。 - Kevin B
你是对的。问题在于我的服务器没有发送正确的头部信息(我使用wget/curl进行了调试)。 - ducin
1个回答

1

您是否启用了CORS工具?您可以通过装饰调用方法或在配置中设置它来使用该工具。

鉴于问题中未表明PyCachedAdmin的实现方式,我猜测您可能没有启用该工具,要启用它,只需更改配置字典并执行以下操作:

    cherrypy.quickstart(PyCachedAdmin(),
                        config={
                            '/': {
                               'request.dispatch':
                                    cherrypy.dispatch.MethodDispatcher(),
                               'tools.CORS.on': True}})

如果您在使用PyCacheAdmin时所使用的方法已经被装饰或使用了_cp_config,则不需要额外的配置,这些答案也无法帮助您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接