在本地运行烧瓶,尝试呼叫:
@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?
答案 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;