Облачная функция Google Python Ошибка CORS На запрашиваемом ресурсе отсутствует заголовок «Access-Control-Allow-Origin». - PullRequest
0 голосов
/ 28 октября 2018

Я следовал инструкциям на https://cloud.google.com/functions/docs/writing/http#functions_http_cors-python

Так что мой код имеет это в конце

 # Set CORS headers for the preflight request
        if request.method == 'OPTIONS':
            # Allows GET requests from any origin with the Content-Type
            # header and caches preflight response for an 3600s
            headers = {
                'Access-Control-Allow-Origin': '*',
                'Access-Control-Allow-Methods': 'GET',
                'Access-Control-Allow-Headers': 'Content-Type',
                'Access-Control-Max-Age': '3600'
            }

            return ('', 204, headers)

        # Set CORS headers for the main request
        headers = {
            'Content-Type':'application/json',
            'Access-Control-Allow-Origin': '*',
            'Access-Control-Allow-Headers': 'Content-Type',
        }

        # END CORS

        return (res, 200, headers)

где res - JSON

из простого приложения узла, я звоню через

this.http.post(payloadTarget.url, JSON.stringify(clone)).subscribe(res => {
    console.log('request complete', res);
  },
  err => {
    console.log('request failed', err);
  });

я получаю эту ошибку на консоли

В запрашиваемом ресурсе отсутствует заголовок «Access-Control-Allow-Origin». Исходный код 'http://localhost:4200', следовательно, запрещен доступ.

при тестировании POST или OPTIONS с использованием Postman я не вижу ошибки, но я также не вижу HEADERS, которую я должен

Я уверен, что это что-то простое, но, глядя на другие похожие вопросы и ответы, я не могу найти ничего, что указывает на мою проблему

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Вы можете создать функцию, которая добавляет cors к каждому ответу, использовать jsonify para castear dict

from flask import jsonify

def addCors(response, code=200):
    headers = {'Access-Control-Allow-Origin': '*'}
    return (response, code, headers)

def func_with_cors(request):
    response = jsonify({"key1":"value1","key2":"value2"})
    return addCors(response)

, затем развернуть func_with_cors

gcloud, развернуть func_with_cors --runtime python37 --trigger-http

0 голосов
/ 29 октября 2018

Я думаю, что проблема в том, что вы пропустили POST из вашего ответа ОПЦИИ.С CORS вам нужно будет определиться, какие методы http приемлемы.С учетом вышесказанного вам необходимо обновить предварительный запрос до:

    # Set CORS headers for the preflight request
    if request.method == 'OPTIONS':
        # Allows GET requests from any origin with the Content-Type
        # header and caches preflight response for an 3600s
        headers = {
            'Access-Control-Allow-Origin': '*',
            'Access-Control-Allow-Methods': 'GET, POST',
            'Access-Control-Allow-Headers': 'Content-Type',
            'Access-Control-Max-Age': '3600'
        }

        return ('', 204, headers)

    # Set CORS headers for the main request
    headers = {
        'Content-Type':'application/json',
        'Access-Control-Allow-Origin': '*',
        'Access-Control-Allow-Headers': 'Content-Type',
    }

    # END CORS

    return (res, 200, headers)

В качестве альтернативы вы можете установить значение:

'Access-Control-Allow-Methods': '*'

Если вы нечто касается безопасности.

Кроме того, причина того, что вы не получаете эти ошибки через POSTMAN, связана с характером запроса - все современные браузеры перехватывают ваш запрос и проверяют, совпадают ли источники (домен,порт, протокол и т. д.), если они этого не делают, перед пунктом назначения делается запрос перед полетом (OPTIONS), чтобы убедиться, что все в порядке.Сайты, такие как POSTMAN, и программное обеспечение, такое как Fiddler, не запускаются из браузера и отправляются без каких-либо проверок.

...