Flask: передача данных из AJAX в вызов render_template (), перенаправление / обновление страницы с параметрами - PullRequest
0 голосов
/ 26 февраля 2020

Эта проблема связана с тем, что я еще не понял, как правильно передать данные из javascript в Flask / Python через AJAX.

Я создал приложение Flask, которое использует JsPsych в качестве javascript / front-end-фреймворка для онлайн-эксперимента. jsPsych позволяет вам создать функцию-обработчик on_finish(), которая выполняется после завершения эксперимента.

Я хотел, чтобы данные моего эксперимента были сохранены на бэкэнде, и это должно было стать концом эксперимента. Я создал функцию с именем data_to_csv(), которая была смонтирована на URL /temp_storage, которая сделала это. Затем я создал другую конечную точку URL для /experiment_end, которая отображает простую страницу html, в которой говорится, что эксперимент завершен и данные сохранены.

    jsPsych.init({
        ...
        on_finish: function() {
          var subj_id = jsPsych.data.get().select('user_id').values[0];
          var test_trials_collection = jsPsych.data.get();

          var test_trial_json = test_trials_collection.json();
          $.ajax({
            type: "POST",
            url: "/temp_storage",
            data: {experiment_data:test_trial_json, webapp_id:subj_id},
            success: function(response) {
              window.location.href="/experiment_end";
            },
            error: function(xhr, textStatus, thrownError) {
              alert('An error occurred while trying to save data');
              console.log(thrownError);
            }
          });
},
});

Сторона Flask / код для /temp_storage выглядело как ...

@app.route('/temp_storage', methods=['GET', 'POST'])
def data_csv_func():
    test_trial_json_obj = request.form['experiment_data']
    subj_id = request.form['webapp_id']
    test_trial_json_obj = json.loads(test_trial_json_obj)
    df_data = pd.DataFrame(test_trial_json_obj)
    csv_name = "app_dir/static/textdata/" + "appid_" + str(subj_id) + ".csv"
    df_data.to_csv(csv_name)
    return "Experiment is over!"

@app.route('/experiment_end', methods=['GET', 'POST'])
def show_qualtrics_after_experiment():
    return render_template("end.html")

Но теперь я не хочу, чтобы вызов AJAX просто закончил мой эксперимент. Я хочу, чтобы мой AJAX звонок привел к открытию новой веб-страницы в приложении Flask, содержащей опрос take_qualtrics.html. Мне также нужно, чтобы take_qualtrics.html имел, по крайней мере, строку webapp_id, переданную в него (но было бы идеально, если бы я мог также передать объект json для данных jspsych, то есть test_trials_json_obj). Это делается для того, чтобы связать ответы на опрос и данные эксперимента с веб-приложением

. Сначала я просто попытался заменить оператор возврата в data_csv_func() на return render_template("take_qualtrics.html", data={"webapp_id":subj_id, "experiment_data":test_trial_json_obj}), и я удалил / закомментировал вызов windows.href("/experiment_end"). Я сохранил вызов AJAX как есть (URL был все еще /temp_storage), я обнаружил, что это выполнит data_to_csv(), но вызов render_template() фактически не перенаправит мою веб-страницу на другой URL.

Так что кажется, что AJAX вызов функции Flask не может фактически вызвать перенаправления на стороне пользователя. И я не уверен, как обойти это в настоящее время. Я хочу иметь способ загрузки take_qualtrics.html и передачи ему идентификатора веб-приложения (созданного в javascript) в качестве аргумента.

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