Как разрешить запуск CORS в облаке Google? - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть микросервис реагирования (через nginx), развернутый в облачном прогоне Google с переменной окружения, для бэкэнда которого задан другой экземпляр облачного прогона Google, в котором работает gunicorn, который обслуживает бэкэнд.

My * Приложение 1013 * настроено в соответствии со всем, что я мог найти о разрешении CORS:

app = Flask(__name__)
app.config.from_object(config)
CORS(app, resources={r"/*": {"origins": "*"}})
app.config['CORS_HEADERS'] = 'Content-Type'
return app

# Different file, a blueprint's urls:

@blueprint.route('/resources')
@cross_origin()
def get_resources():
...

Тем не менее, я все еще получаю ужас Access to XMLHttpRequest at 'https://backend/resources/' from origin 'https://frontend' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Кто-нибудь имеет какое-либо представление об этом / знать где еще посмотреть, чтобы выяснить это? Я хотел настроить GKE с моими микросервисами, но сначала пошел по пути наименьшего сопротивления, чтобы получить PO C в облаке. У меня есть бэкэнд, говорящий с моим экземпляром Cloud SQL, и я так близко !!

Спасибо

Ответы [ 3 ]

1 голос
/ 21 апреля 2020

Вы настроили больше, чем нужно. Если вам не нужно предоставлять разный доступ к CORS для разных конечных точек, самый простой пример просто требует вызова CORS(app):

from flask import Flask
from flask_cors import CORS

app = Flask(__name__)
CORS(app)

@app.route("/resources")
def get_resources():
  return "Hello, cross-origin-world!"

if __name__ == "__main__":
    app.run('0.0.0.0', 8080, debug=True)

И вы увидите, что заголовок присутствует:

$ curl -I localhost:8080/resources
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 26
Access-Control-Allow-Origin: *
Server: Werkzeug/1.0.1 Python/3.7.4
Date: Tue, 21 Apr 2020 17:19:25 GMT
1 голос
/ 22 апреля 2020

Все было нанесено самому себе.

Как упоминал Дастин Ингрэм, если вы включите CORS для Flask, это будет работать. Я до сих пор не представляю, почему у меня вообще возникают проблемы с CORS, у меня включена поддержка CORS для моего Flask приложения из get go.

После того, как я все разобрал и перераспределил, выдает CORS исчез. Тем не менее, я все равно получил 404, 405 и 308.

Была пара проблем, все мои недостатки, которые в совокупности дали мне эти проблемы. В create-реагировать-app (я думаю, что это делает webpack) переменные среды, передаваемые во время выполнения docker, не учитываются, поэтому переменная среды, которую я установил в Cloud Run, вообще не работала. В настоящее время я выбрал process.env.VARIABLE || маршрут 'hardcoded-url'. Как только я понял это, я также вспомнил, что конечные косые черты в flask URL-адресах плохие ... Они дали мне 308-е, постоянные перенаправления. Когда я понял это, я понял, что во время развертывания вручную я не переключал образ сборки облака на самый последний. Вздох. Как только я начал развертывать последние образы, все начало работать. Yay!

Спасибо, Дастин и Гейб, что уделили мне время для моей глупости.

1 голос
/ 21 апреля 2020

Я также недавно боролся с этим ... Моя проблема пыталась использовать некоторую библиотеку JS, чтобы сделать мои URL-запросы "более простыми", и вместо этого искала заголовки на стороне запроса (не на стороне сервера). Перешел на использование только простого XMLHttp, и он начал работать нормально. Я также переключился с application/json на application/x-www-form-urlencoded. Я не знаю, имело ли это значение или нет, но в том числе для полноты.

Вы также не должны (я говорю, не должен, но вы знаете, как это происходит) ничего другого, кроме:

CORS (приложение). Все @ межрегиональные компоненты и части конфигурации предназначены только для узкого доступа к CORS, поэтому он не является широко открытым, но в любом случае он открыт для вашего исходного кода (CORS(app, resources={r"/*": {"origins": "*"}}) - это то же самое, что и CORS(app)).

Короче говоря, попробуйте взглянуть на объект запроса, а не на сторону Flask.

Редактировать: добавление кода запроса, который работал для меня после того, как я не смог Библиотека "fetch" не работает:

var xhttp = new XMLHttpRequest();
xhttp.open("POST", <url>, true);
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
xhttp.send(Data)
...