Cloud 运行 是否从我的后端删除了 CORS headers?
Is Cloud Run removing the CORS headers from my backend?
我在 Python 中使用 Quart, Quart-CORS and SQLAlchemy 开发了一个简单的后端。当我使用 Postman 在本地主机上尝试不同的端点时,正确返回了 CORS headers。一旦我将它部署在 Google Cloud 运行 上,似乎 Google 删除了后端 returns 的每个响应的所有 CORS headers,所以我的前端拒绝响应。
有人遇到过这个问题吗?关于如何解决它的任何想法?如果需要我这边的任何其他信息,请告诉我。
谢谢,
我一直在努力,到目前为止它似乎在工作。以下代码结合了两种不同的解决方案:
- 手动添加 CORS headers 到 Quart 提供的 make_response 方法。
- 使用 add-on 库中的方法 Quart-CORS。
单独使用这些解决方案中的任何一个可能就足够了,但不知怎的,只有这两个解决方案我才设法解决了这个问题。
Python代码:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Script used to launch the API.
"""
from __future__ import print_function
from quart import Quart, Blueprint, request, make_response, jsonify
from quart_cors import cors, route_cors
from http import HTTPStatus
import secrets
blueprint_v0_login_options = Blueprint('v0_login_options', __name__)
blueprint_v0_login_post = Blueprint('v0_login_post', __name__)
CORS_SETTINGS = {'allow_origin': '*'}
@blueprint_v0_login_options.route('/v0/login', methods=['OPTIONS'], provide_automatic_options=False)
@route_cors(**CORS_SETTINGS, provide_automatic_options=False)
async def v0_login_options():
return await make_response(
jsonify(None),
HTTPStatus.ACCEPTED,
{
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept',
'Access-Control-Allow-Methods': 'OPTIONS, POST'
}
)
@blueprint_v0_login_post.route('/v0/login', methods=['POST'], provide_automatic_options=False)
@route_cors(**CORS_SETTINGS, provide_automatic_options=False)
async def v0_login_post():
json = await request.get_json()
return await make_response(
jsonify(json),
HTTPStatus.ACCEPTED,
{
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept'
}
)
def main():
# Start API server.
quart_app = Quart(__name__)
quart_app = cors(quart_app, **CORS_SETTINGS)
quart_app.secret_key = secrets.token_urlsafe(16)
# Register blueprints.
quart_app.register_blueprint(blueprint_v0_login_options)
quart_app.register_blueprint(blueprint_v0_login_post)
quart_app.run(host='0.0.0.0', port=8081)
if __name__ == "__main__":
main()
Docker 文件:
FROM python:3.8
COPY . /api
WORKDIR /api
# Prepare Python.
RUN apt-get update
RUN pip install --upgrade pip
ENV PYTHONUNBUFFERED=1
# Install module.
RUN python setup.py install
# Run.
CMD PYTHONPATH=. api
谢谢!!
我在 Python 中使用 Quart, Quart-CORS and SQLAlchemy 开发了一个简单的后端。当我使用 Postman 在本地主机上尝试不同的端点时,正确返回了 CORS headers。一旦我将它部署在 Google Cloud 运行 上,似乎 Google 删除了后端 returns 的每个响应的所有 CORS headers,所以我的前端拒绝响应。
有人遇到过这个问题吗?关于如何解决它的任何想法?如果需要我这边的任何其他信息,请告诉我。
谢谢,
我一直在努力,到目前为止它似乎在工作。以下代码结合了两种不同的解决方案:
- 手动添加 CORS headers 到 Quart 提供的 make_response 方法。
- 使用 add-on 库中的方法 Quart-CORS。
单独使用这些解决方案中的任何一个可能就足够了,但不知怎的,只有这两个解决方案我才设法解决了这个问题。
Python代码:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Script used to launch the API.
"""
from __future__ import print_function
from quart import Quart, Blueprint, request, make_response, jsonify
from quart_cors import cors, route_cors
from http import HTTPStatus
import secrets
blueprint_v0_login_options = Blueprint('v0_login_options', __name__)
blueprint_v0_login_post = Blueprint('v0_login_post', __name__)
CORS_SETTINGS = {'allow_origin': '*'}
@blueprint_v0_login_options.route('/v0/login', methods=['OPTIONS'], provide_automatic_options=False)
@route_cors(**CORS_SETTINGS, provide_automatic_options=False)
async def v0_login_options():
return await make_response(
jsonify(None),
HTTPStatus.ACCEPTED,
{
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept',
'Access-Control-Allow-Methods': 'OPTIONS, POST'
}
)
@blueprint_v0_login_post.route('/v0/login', methods=['POST'], provide_automatic_options=False)
@route_cors(**CORS_SETTINGS, provide_automatic_options=False)
async def v0_login_post():
json = await request.get_json()
return await make_response(
jsonify(json),
HTTPStatus.ACCEPTED,
{
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept'
}
)
def main():
# Start API server.
quart_app = Quart(__name__)
quart_app = cors(quart_app, **CORS_SETTINGS)
quart_app.secret_key = secrets.token_urlsafe(16)
# Register blueprints.
quart_app.register_blueprint(blueprint_v0_login_options)
quart_app.register_blueprint(blueprint_v0_login_post)
quart_app.run(host='0.0.0.0', port=8081)
if __name__ == "__main__":
main()
Docker 文件:
FROM python:3.8
COPY . /api
WORKDIR /api
# Prepare Python.
RUN apt-get update
RUN pip install --upgrade pip
ENV PYTHONUNBUFFERED=1
# Install module.
RUN python setup.py install
# Run.
CMD PYTHONPATH=. api
谢谢!!