flask重定向“XMLHttpRequest无法加载...”错误localhost

时间:2016-09-24 01:08:10

标签: python flask flask-cors

在本地运行烧瓶,尝试呼叫:

@app.route('/foo_route', methods=['POST'])
@cross_origin(origin='*')
def foo():
    return redirect("https://www.google.com/")

我收到以下错误:

  

XMLHttpRequest无法加载https://www.google.com/。没有   请求中存在“Access-Control-Allow-Origin”标头   资源。因此不允许来源“http://127.0.0.1:5000”   访问

我尝试使用CORS:

app = Flask(__name__)
CORS(app)

和我路线上的@cross_origin()一起。这里出了什么问题?我正在读这个在本地运行时可能是一个chrome bug?

2 个答案:

答案 0 :(得分:2)

我也有同样的问题!它不是Chrome错误,它内置于chrome中以确保安全性。 (跨源资源共享)是必须存在于apache httpd.conf or apache.conf or .htaccess配置文件中的标头。如果你在NGINX上,你必须编辑defaults.conf or nginx.conf file它基本上使它成为Web服务器从其自己的域以外的地方接受HTTP请求。修复它的“真正”方法是实际进入Web服务器(通过ssh)并编辑适用的.conf以包含此标头。如果您使用的是apache,则可以在文件顶部添加Header set Access-Control-Allow-Origin "*"。执行此操作后,重新启动apache以确保保存更改(service httpd restart)。如果您在NGINX上,请使用此配置:

   #
# Wide-open CORS config for nginx
#
location / {
     if ($request_method = 'OPTIONS') {
        add_header 'Access-Control-Allow-Origin' '*';
        #
        # Om nom nom cookies
        #
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        #
        # Custom headers and headers various browsers *should* be OK with but aren't
        #
        add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
        #
        # Tell client that this pre-flight info is valid for 20 days
        #
        add_header 'Access-Control-Max-Age' 1728000;
        add_header 'Content-Type' 'text/plain charset=UTF-8';
        add_header 'Content-Length' 0;
        return 204;
     }
     if ($request_method = 'POST') {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
     }
     if ($request_method = 'GET') {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
     }
}

现在,我想,根据您的示例,您无权访问网络服务器(因为您在网址中添加了Google的网址)。这是它变得棘手的地方。

您的一个选择是使用http://www.whateverorigin.org/。它绕过CORS并有效地检索数据。要使用它,您可以运行:

$.getJSON('http://whateverorigin.org/get?url=' + encodeURIComponent('http://google.com') + '&callback=?', function(data){
    alert(data.contents);
});

无论Web服务器上存在CORS,都会检索响应。

如果您不想更改任何现有代码并使用Google Chrome,则可以解决此CORS问题。您可以做的一件事是安装此浏览器扩展程序:https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?utm_source=plus 你可以绕过CORS并运行你的程序。

希望这适合你!

答案 1 :(得分:0)

我决定做的是将网址传递给客户端,然后让客户端重定向。

@app.route('/foo_route', methods=['POST'])
@cross_origin(origin='*')
def foo():
    return "https://www.google.com/"

然后在客户端(javascript):

window.location.href = serverSentUrl;