我是 python 新手,我正在尝试通过 jquery ajax 调用使用 http 请求从 python 脚本中获取数据。但是,我收到以下错误,因为 python 脚本不允许跨域请求。
跨源请求被阻止:同源策略不允许读取http://somehost.com:8000/gen.py处的远程资源。 (原因:CORS 标头“Access-Control-Allow-Origin”丢失)。
我不确定需要在下面的脚本中更改什么来服务器跨域请求。需要明确的是,我使用的是 python v2.6.6,它安装在 Red Hat Enterprise Linux Server 6.5 版(圣地亚哥)上。下面是我到目前为止尝试过的 python 服务器代码。
#!/usr/bin/env python
import BaseHTTPServer
import CGIHTTPServer
import cgitb; cgitb.enable() ## This line enables CGI error reporting
server = BaseHTTPServer.HTTPServer
handler = CGIHTTPServer.CGIHTTPRequestHandler
server_address = ("", 8000)
handler.cgi_directories = ["/"]
httpd = server(server_address, handler)
httpd.serve_forever()
这是位于不同服务器上的 html 文件中的 jquery 代码:
$(document).ready(function(){
$("button").click(function(){
$.ajax({
url: "http://somehost.com:8000/gen.py",
type: 'GET',
success: function(data) {
console.log(data);
},
error: function(e) {
console.log(e.message);
}
});
});
});
任何指向这一点的指示都是值得重视的。如果我需要提供更多详细信息,请告诉我。
提前谢谢您。
正如 e4c5 提到的,您需要发出 CORS 请求。由于 jquery 不是由提供
gen.py
的同一服务器提供服务,因此您需要在 python 服务器端有一个标头以允许浏览器检索资源。这个同源策略是为了防止跨站脚本。
要使用 BaseHTTPServer 执行此操作,您需要重新定义请求处理程序并提供对
self.send_header("Access-Control-Allow-Origin", "*")
的调用。这个 answer 展示了如何使用 BaseHTTPServer 来做到这一点,但它相当长且复杂。
这个 answer 有一个关于如何在 SimpleHTTPServer 上设置 CORS 标头的非常简单的实现,它具有与 BaseHTTPServer 类似的结构,您可以很容易地移植它。
*关于
*
调用中的 send_header
,这允许来自任何来源的请求获得 gen.py
。根据具体情况,这可能并不重要,但如果确实如此,您可能需要设置更严格的策略。