Запрос CORS POST с jQuery с использованием функций Google (Python) завершается неудачно с Flask_Cors, но работает в другом примере - PullRequest
0 голосов
/ 03 мая 2020

спасибо, что нашли время проверить мой вопрос.

По какой-то причине один из моих CORS-Post-Requests не прошел, и я не могу определить причину этого. Поскольку я не нашел проблему, я создаю вторую более простую функцию, которая работает безупречно.

Ниже приведены оба примера:

Я создал простую пользовательскую форму для регистрации пользователей в Mailchimp, запустив следующий запрос POST:

            async function addUserToMailchimp(){
                return jQuery.getJSON("https://api.ipify.org?format=json")
                    .then(data => {return jQuery.getJSON("https://ipapi.co/"+data.ip+"/json/")})
                    .then(locationData => {return {
                        city: locationData.city,
                        region: locationData.region
                    }}).then(locationData => {


                                var email = document.getElementById("email").value;
                                var interesse = document.getElementById("interesse").value;
                                var typ = jQuery('.selectpicker').val();
                                var city = locationData.city;
                                var region = locationData.region;


                                var data = {
                                        email: email,
                                        interesse: interesse,
                                        typ: typ,
                                        stadt: city,
                                        region: region
                                    };

                                console.log(typeof data);
                                console.log(data);

                                jQuery.post({
                                   type: "POST",
                                   method: "POST",
                                   crossDomain: true,
                                    dataType: "json",
                                    url: "GOOGLECLOUDFUNCTION-URL",
                                    data: data,
                                    success: function(data){
                                        console.log(data)
                                    }
                                })


                        }

                )
            };


        jQuery('#MailchimpSignup').submit(function (e) {
            e.preventDefault();
            addUserToMailchimp();
        });

Облачная функция Google выполняет следующие действия:

import google.cloud.logging
client = google.cloud.logging.Client()
client.setup_logging()
import logging
from mailchimp3 import MailChimp
import os
from flask_cors import CORS, cross_origin

@cross_origin(origins="*")
def MailchimpSignUp(request):
    User = os.environ.get('User', 'Specified environment variable is not set.')
    API_Key = os.environ.get('API_Key', 'Specified environment variable is not set.')
    client = MailChimp(mc_user=User, mc_api=API_Key)
    try:
        logging.info(request.values)
        data = request.values
        email = data["email"]
        interesse = data["interesse"]
        typ = data["typ"]
        stadt = data["stadt"]
        region = data["region"]
        res_m = client.lists.members.create("LIST_ID", {
            'email_address': email,
            'status': "subscribed",
            'merge_fields': {
                'INTERESSE': interesse,
                'TYP': typ
                'STADT': stadt,
                'REGION': region
            },
        })
        logging.info(res_m)
        return {"mailchimp_result":res_m}
    except Exception as e:
        logging.error(RuntimeError('Error Test', e))

результат:

Access to XMLHttpRequest at 'GOOGLECLOUDFUNCTION-URL' from origin 'http://localhost:63342' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
VM6:1 POST GOOGLECLOUDFUNCTION-URL net::ERR_FAILED

Подобно этому, я создал другую тестовую функцию, для которой POST-запрос работал отлично. Для этой функции я использовал тот же Python пакет, то есть flask_cors, чтобы добавить необходимые заголовки.

См. Пример ниже:

            var data = {
                    header_customer_group: user_group,
                    header_message: notificaiton_body,
                    header_password: password
                };

            console.log(typeof data);
            console.log(data);

            jQuery.post({
               type: "POST",
               method: "POST",
               crossDomain: true,
                dataType: "json",
                url: "GOOGLECLOUDFUNCTION-URL",
                data: data,
                success: function(data){
                    console.log(data)
                }
            })

со следующим кодом функции Google Cloud:

from flask_cors import CORS, cross_origin
import google.cloud.logging
client = google.cloud.logging.Client()
client.setup_logging()
import logging

@cross_origin(origins="*")
def send_notification(request):
    try:
        data = request.values
        password = data["header_password"]
        return {"password":password}
    except Exception as e:
        logging.error(RuntimeError('Error Test', e))

Результат:

{password: "test"}

Видите ли вы причину, по которой один работает, а другой не работает. Это держало меня часами, часами и часами, и я просто, кажется, упускаю главное.

Спасибо за вашу помощь! Высоко ценим это! Лучший ~

1 Ответ

0 голосов
/ 04 мая 2020

Я не смог увидеть вашу flask инициализацию, но попробуйте это там, где ваша flask инициализируется.

from flask import Flask, request
from flask_cors import CORS

app = Flask(__name__)
CORS(app)

if __name__ == "__main__":
    app.run(debug=True)
...