我一直在尝试在Google应用引擎上启用CORS头,但是我在互联网上找到的方法都没有起作用。
我的应用程序使用Python / Django编写,我希望我的前端应用程序(单独托管)能够对我的后端平台进行API调用,该平台位于Google应用引擎上。
2017年1月的发布说明说:
他们提供的启用CORS的解决方案是将以下代码片段添加到服务的OpenAPI配置中。
我会很乐意为您翻译。这段话的意思是:“所以我按照this的例子,在我的代码库中创建了两个文件。”
“openapi.yml:”
现在,应用程序已经成功部署,但它的行为很奇怪。所有应该返回200响应的请求仍然会抛出CORS错误,但返回400状态的请求可以正常工作。
例如-注册API需要这些字段-email、password1、password2,其中password1应该与password2相同。现在当我发送正确的参数时,我得到HTTP 502的响应,说:
没有'Access-Control-Allow-Origin'头在请求的资源上出现。因此,来自{origin-url}的访问不被允许。响应具有HTTP状态代码502。
但是当我发送password1与password2不相同时,我会收到HTTP 400响应,我确信这是从我的代码中发出的,因为如果password1和password2不匹配,响应是代码中编写的字典。此外,在这种情况下,标头具有Access-Control-Allow-Origin为*,但在前一种情况下并非如此。
我还检查了我的nginx错误日志,它显示:
27462个上游在读取响应标头时过早地关闭了连接。
我在这里做错了什么? 这是在GAE中启用CORS的正确方法吗?
我的应用程序使用Python / Django编写,我希望我的前端应用程序(单独托管)能够对我的后端平台进行API调用,该平台位于Google应用引擎上。
2017年1月的发布说明说:
可以在这里看到。我们正在更改可扩展服务代理(ESP)的行为,以默认拒绝跨域资源共享(CORS)请求
他们提供的启用CORS的解决方案是将以下代码片段添加到服务的OpenAPI配置中。
"host": "echo-api.endpoints.YOUR_PROJECT_ID.cloud.goog",
"x-google-endpoints": [
{
"name": "echo-api.endpoints.YOUR_PROJECT_ID.cloud.goog",
"allowCors": "true"
}
],
...
我会很乐意为您翻译。这段话的意思是:“所以我按照this的例子,在我的代码库中创建了两个文件。”
“openapi.yml:”
swagger: "2.0"
info:
description: "Google Cloud Endpoints APIs"
title: "APIs"
version: "1.0.0"
host: "echo-api.endpoints.<PROJECT-ID>.cloud.goog"
x-google-endpoints:
- name: "echo-api.endpoints.<PROJECT-ID>.cloud.goog"
allowCors: "true"
paths:
"/api/v1/sign-up":
post:
description: "Sends an email for verfication"
operationId: "signup"
produces:
- "application/json"
responses:
200:
description: "OK"
parameters:
- description: "Email address of the user"
in: body
name: email
required: true
schema:
type: string
- description: "password1"
in: body
name: password1
required: true
schema:
type: string
- description: "password2"
in: body
name: password2
required: true
schema:
type: string
openapi-appengine.yml:
swagger: "2.0"
info:
description: "Google Cloud Endpoints API fo localinsights backend server"
title: "Localinsights APIs"
version: "1.0.0"
host: "<PROJECT-ID>.appspot.com"
然后我运行了这个命令:
gcloud service-management deploy openapi.yml
然后我编辑了我的app.yml文件,使其看起来像这样(新增了endpoints_api_service。在添加此内容之前,应用程序会无错误地部署):
runtime: python
env: flex
entrypoint: gunicorn -b :$PORT myapp.wsgi
beta_settings:
cloud_sql_instances: <cloud instance>
runtime_config:
python_version: 3
automatic_scaling:
min_num_instances: 1
max_num_instances: 1
resources:
cpu: 1
memory_gb: 0.90
disk_size_gb: 10
env_variables:
DJANGO_SETTINGS_MODULE: myapp.settings.staging
DATABASE_URL: <dj-database-url>
endpoints_api_service:
name: "<PROJECT-ID>.appspot.com"
config_id: "<CONFIG-ID>"
然后我只需部署应用程序即可
gcloud app deploy
现在,应用程序已经成功部署,但它的行为很奇怪。所有应该返回200响应的请求仍然会抛出CORS错误,但返回400状态的请求可以正常工作。
例如-注册API需要这些字段-email、password1、password2,其中password1应该与password2相同。现在当我发送正确的参数时,我得到HTTP 502的响应,说:
没有'Access-Control-Allow-Origin'头在请求的资源上出现。因此,来自{origin-url}的访问不被允许。响应具有HTTP状态代码502。
但是当我发送password1与password2不相同时,我会收到HTTP 400响应,我确信这是从我的代码中发出的,因为如果password1和password2不匹配,响应是代码中编写的字典。此外,在这种情况下,标头具有Access-Control-Allow-Origin为*,但在前一种情况下并非如此。
我还检查了我的nginx错误日志,它显示:
27462个上游在读取响应标头时过早地关闭了连接。
我在这里做错了什么? 这是在GAE中启用CORS的正确方法吗?