【问题标题】:cherrypy/jquery CORS troublecherrypy/jquery CORS 问题
【发布时间】:2013-11-05 21:33:55
【问题描述】:

我有一个基于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()}})

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

$.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 测试都通过了。跨域的东西有问题。

【问题讨论】:

  • 什么是“浏览器”?
  • 它是 chrome 27.0.1453.93
  • crossDomain: true 和 $.support.cors = true 绝对不需要,除非您的服务器返回 jsonp(此时您不需要 cors),否则您不需要 jsonp。也无法发送 POST jsonp 请求,因为 jsonp 是使用脚本标签而不是 xhr 发送的。您的第一个 sn-p 是正确的。您可以发布正在发送的请求和响应标头吗? (铬控制台)
  • @KevinB 但是当我执行$.ajax({ url:'http://localhost:8080/', type: "POST", data: {command:"version"} }).done(function(){ console.log('hej'); }); 时出现错误:XMLHttpRequest cannot load http://localhost:8080/. Origin http://localhost is not allowed by Access-Control-Allow-Origin.
  • 没关系。但做出任何这些改变都不会改变结果。你的javascript很好。问题更可能是浏览器权限(不太可能)或服务器没有正确处理 cors 请求。

标签: javascript jquery python cors cherrypy


【解决方案1】:

您是否正在激活 CORS 工具?您可以通过装饰调用方法或在配置上设置它来使用该工具。

鉴于PyCachedAdmin 的实现没有在问题上表达,我可能猜想您可能没有启用该工具,为此您只需更改配置字典并进行如下操作:

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

或者,如果您在 PyCacheAdmin 上使用的方法已被修饰或使用 _cp_config,则不需要额外配置,此答案对您没有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-12
    • 2015-12-16
    • 2015-08-20
    • 1970-01-01
    • 2010-12-30
    • 2019-08-22
    • 1970-01-01
    • 2016-09-10
    相关资源
    最近更新 更多