Python - 访问控制允许来源

问题描述 投票:0回答:1

我是 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);
          }
        });
    });
});

任何指向这一点的指示都是值得重视的。如果我需要提供更多详细信息,请告诉我。

提前谢谢您。

jquery python server
1个回答
0
投票

正如 e4c5 提到的,您需要发出 CORS 请求。由于 jquery 不是由提供

gen.py
的同一服务器提供服务,因此您需要在 python 服务器端有一个标头以允许浏览器检索资源。这个同源策略是为了防止跨站脚本。

要使用 BaseHTTPServer 执行此操作,您需要重新定义请求处理程序并提供对

self.send_header("Access-Control-Allow-Origin", "*")
的调用。这个 answer 展示了如何使用 BaseHTTPServer 来做到这一点,但它相当长且复杂。

这个 answer 有一个关于如何在 SimpleHTTPServer 上设置 CORS 标头的非常简单的实现,它具有与 BaseHTTPServer 类似的结构,您可以很容易地移植它。

*关于

*
调用中的
send_header
,这允许来自任何来源的请求获得
gen.py
。根据具体情况,这可能并不重要,但如果确实如此,您可能需要设置更严格的策略。

© www.soinside.com 2019 - 2024. All rights reserved.