Эта проблема связана с тем, что я еще не понял, как правильно передать данные из 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) в качестве аргумента.