如何在Google App Engine Python服务器上启用CORS?

11

我在Javascript控制台上看到以下错误:

VM31:1 XMLHttpRequest cannot load '<some-url>'. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin '<my-url>' is therefore not allowed access.

如何在Google App Engine(Python)中启用跨域资源共享,以访问其他网站?


<some-url>是一个静态文件,还是你正在使用Python代码处理它?Jeffery的答案涵盖了第一种情况... - Greg
4个回答

11

对于一个 Python 脚本,您可以在其他 self.response.header 行附近添加以下行。

self.response.headers['Access-Control-Allow-Origin'] = '*'

这对我有用。 这个想法来自于另一个答案的笔记中列出的 php 问题。


同时,response = flask.jsonify({'status': 'UP!'})response.headers.add('Access-Control-Allow-Origin', '*')也需要翻译。 - howMuchCheeseIsTooMuchCheese

11

你需要在你的yaml配置中使用Access-Control-Allow-Origin http头

handlers:
- url: /
  ...
  http_headers:
    Access-Control-Allow-Origin: http://my-url

文档中查找更多有关CORS支持的信息


3
好的,请问需要翻译的上下文是什么?这样我可以更好地理解并为您提供准确的翻译。 - anshulix
@anshulix,我不确定我理解你的问题。能详细说明一下吗? - Jeffrey Godwyll
1
@JeffreyGodwyll 我也遇到了同样的问题。我正在尝试为一个脚本添加http_header,但是出现了错误:google.appengine.api.yaml_errors.EventError: 映射类型脚本不支持属性“http_headers”。 - Morgan Allen
此属性(http_headers)被脚本处理程序有意禁止。以下是 PHP 的解决方法:https://github.com/riannucci/rietveldv2/issues/27 - Tom Russell

1

如果您想了解如何在Springboot中允许所有来源的AppEngine实例,可以按照以下步骤操作:

  • 在项目中使用@CrossOrigin(origins = "*")注释来标注@RestController
  • 或者使用相同的注释来标注任何具有@GetMapping、@PostMapping等注释的特定资源方法。

无需设置app.yaml中的任何处理程序。实际上,根据文档中的说明更改app.yaml文件时它不起作用。

...
...
...

@SpringBootApplication
@RestController
@CrossOrigin(origins = "*")  // <--- here 
public class SpringbootApplication {

 ...
 ...
  @GetMapping("/")      
  @CrossOrigin(origins = "*").     // <--- or here 
  public String hello() {
      .....
  }

}

0

如果您想提供脚本服务,不幸的是,您不能使用Jeffrey Godwyll的答案。文档中,在http_headers的第二句话中有一些hidden说明:"如果您需要在脚本处理程序中设置HTTP标头,则应在应用程序代码中执行此操作。"

另一个可能性是允许您的应用程序通过“过早”返回标头来处理预检请求。注意:如果您正在构建POST端点,请确保它在除所需请求方法之外的所有内容上返回允许跨站点请求标头。有时也可能会有预检GET(出于某种奇怪的原因):

from flask import Flask, request

HEADERS = {
    "Access-Control-Allow-Origin": "*",
}

app = Flask(__name__)

@app.route("/", methods=["GET", "POST"])
def main():
    if request.method != "POST":
        return ("", 204, HEADERS)

    return "After the POST"

如果您正在构建仅限 GET 的应用程序,则可以编写 if request.method == "OPTIONS":...,就像 Cloud Functions documentation 中所述。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接