【问题标题】:How to enable CORS on Google App Engine Python Server?如何在 Google App Engine Python 服务器上启用 CORS?
【发布时间】:2021-08-18 04:12:46
【问题描述】:

我在 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) 的跨域资源共享访问?

【问题讨论】:

  • 是静态文件,还是您正在使用 python 代码处理的文件?杰弗里的回答涵盖了第一种情况……

标签: python google-app-engine cors


【解决方案1】:

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

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

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

【讨论】:

  • 还有response = flask.jsonify({'status': 'UP!'}) response.headers.add('Access-Control-Allow-Origin', '*')
【解决方案2】:

您必须在 yaml 配置中使用 Access-Control-Allow-Origin http 标头

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

docs 中了解更多关于 CORS 支持的信息

【讨论】:

  • 为整个应用做这件事怎么样? static_dir下应该提供什么
  • @anshulix 我不确定我是否遵循您的要求。需要详细说明吗?
  • @JeffreyGodwyll 我遇到了同样的问题。我正在尝试为脚本添加 http_header 并收到错误:google.appengine.api.yaml_errors.EventError: Unexpected attribute "http_headers" for mapping type script。
  • 此属性 (http_headers) 被故意禁止用于脚本处理程序。这是 PHP 的解决方法:github.com/riannucci/rietveldv2/issues/27
【解决方案3】:

对于那些想知道如何在 Springboot 中基本上允许 AppEngine 实例的所有来源的人:

  • 在您的项目具有的@RestController 类上使用@CrossOrigin(origins = "*") 注释
  • 或对具有@GetMapping, @PostMapping, etc 注释之一的任何特定资源方法使用上述相同的注释。

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

...
...
...

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

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

}

【讨论】:

    【解决方案4】:

    如果您想提供脚本,那么很遗憾,您不能使用 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-11
      • 2013-10-31
      • 2014-05-27
      • 2018-02-06
      • 2020-06-13
      • 1970-01-01
      • 2020-01-17
      相关资源
      最近更新 更多