Почему мои AJAX-запросы не проходят? - PullRequest
0 голосов
/ 17 марта 2019

Это - мой github-репозиторий для этой живой демонстрации, которую я сейчас выполняю.

// index.js - это место, откуда отправляется запрос POST от

class Index extends React.Component {
    state = {
        loading: false,
    };

    handleClickLoading = () => {
        this.setState(state => ({
            loading: true,
        }));
        var jqXHR = $.ajax({
            type: "POST",
            url: "http://localhost:5000/login",
            async: true,
            data: { mydata: [Cookies.get('links'), Cookies.get('numSentences')] },
            success: function(){
                const data = JSON.parse(jqXHR.responseText);
                console.log(data);
            }
        });
        Cookies.set('final', jqXHR.responseText);
        console.log(jqXHR.responseText)
    };

    render() {
        const {loading} = this.state;
        return (
            <div>
                <AppBar/>
                <Block/>
                <Card>
                    <CardActions>
                    <Button size="large"
                            fullWidth={true}
                            onClick={this.handleClickLoading}>Submit</Button>
                    </CardActions>
                </Card>
                <Fade
                    in={loading}
                    unmountOnExit
                    >
                <BottomBar/>
                </Fade>
            </div>

        )
    }
}

export default Index;

, и он пытается получить данные, запускаемые через скрипты Python через сервер Flask:

...
def crossdomain(origin=None, methods=None, headers=None,
                max_age=21600, attach_to_all=True,
                automatic_options=True):
    if methods is not None:
        methods = ', '.join(sorted(x.upper() for x in methods))
    if headers is not None and not isinstance(headers, list):
        headers = ', '.join(x.upper() for x in headers)
    if not isinstance(origin, list):
        origin = ', '.join(origin)
    if isinstance(max_age, timedelta):
        max_age = max_age.total_seconds()

    def get_methods():
        if methods is not None:
            return methods

        options_resp = current_app.make_default_options_response()
        return options_resp.headers['allow']

    def decorator(f):
        def wrapped_function(*args, **kwargs):
            if automatic_options and request.method == 'OPTIONS':
                resp = current_app.make_default_options_response()
            else:
                resp = make_response(f(*args, **kwargs))
            if not attach_to_all and request.method != 'OPTIONS':
                return resp

            h = resp.headers

            h['Access-Control-Allow-Origin'] = origin
            h['Access-Control-Allow-Methods'] = get_methods()
            h['Access-Control-Max-Age'] = str(max_age)
            if headers is not None:
                h['Access-Control-Allow-Headers'] = headers
            return resp

        f.provide_automatic_options = False
        return update_wrapper(wrapped_function, f)
    return decorator


@app.route("/")

def home():
    return "hi"
@app.route("/index")


@app.route('/login', methods=['GET', 'POST', 'OPTIONS'])
@crossdomain(origin='*')
def login():
   message = None
   if request.method == 'POST':
        datafromjs = request.form['mydata']
        result = "test"
        resp = make_response('{"response": '+result+'}')
        resp.headers['Content-Type'] = "application/json"
        resp.headers.add('Access-Control-Allow-Origin', '*')
        resp.headers.add('Access-Control-Allow-Headers', 'Content-Type,Authorization')
        resp.headers.add('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS')
        return resp
        return render_template('login.html', message='')

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

И это вывод консоли на клик из браузера: enter image description here

и Flask:

enter image description here

Javascript пытается получить выходные данные нескольких функций Python, заданных несколькими параметрами.

Я просто в тупике, и это последний Cog в моем проекте.У меня нет опыта работы с подобными вещами, но любая помощь приветствуется!

1 Ответ

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

Я полагаю, что это проблема CORS, как отмечает Джей Джей Хакала. Даже если вы заходите в тот же домен (localhost), но на другой порт (8080 -> 5000), вам необходим заголовок авторизации (на стороне сервера).

Если вы можете убедиться, что в ответах сервера присутствует заголовок access-control-allow-origin:* (подход с использованием подстановочных знаков), у вас больше не должно быть проблем с ajax.

https://en.wikipedia.org/wiki/Cross-origin_resource_sharing

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...