Запрос Flask — POST отправляет частичные входные значения

#javascript #python #flask #jinja2

#javascript #python #flask #jinja2

Вопрос:

В настоящее время я создаю небольшую игру с Python / Flask и некоторым Javascript, но когда я отправляю свою форму, я могу получить только некоторые значения, а других не существует :

Итак, вот моя форма :

 <form name="question_form" id="question_form" action="{{ url_for('question') }} " method='POST' onsubmit="return validateAnswer()">
            <p class="question">{{ question }}</p>
            <button name="given_answerA" type="submit" class="clickable" id="questions_A" value="{{ answers[0] }}">{{ answers[0] }}</button>
            <button name="given_answerB" type="submit" class="clickable" id="questions_B" value="{{ answers[1] }}">{{ answers[1] }}</button>
            <button name="given_answerC" type="submit" class="clickable" id="questions_C" value="{{ answers[2] }}">{{ answers[2] }}</button>
            <button name="given_answerD" type="submit" class="clickable" id="questions_D" value="{{ answers[3] }}">{{ answers[3] }}</button>
            <input name="nb_question" id="nb_question" type="hidden" value="{{ nb }}"/>
            <input name="choice_good" id="choice_good" type="hidden" value="{{ choice_good }}"/>
        </form>

  

В моем приложении flask вот что я делаю :

 answered = request.form.get('given_answerA')
correct_answer = request.form.get('choice_good')
nb_question = int(request.form.get('nb_question')
  

У меня есть результат для «correct_answer» и «nb_question», но given_answerA не существует, я попытался распечатать запрос.форма для просмотра содержимого, и я вижу только значения choice_good и nb_question.

Я попытался переименовать все мои кнопки с тем же именем, изменив «тип кнопки = отправить» на «тип ввода = отправить», но, похоже, ни один из них не работает..

Есть идеи? Спасибо!

РЕДАКТИРОВАТЬ: похоже, что проблема заключается в функции JS (которую я забыл включить), вот она :

 function validateAnswer() {
    var answered = document.activeElement.id;
    var audio = document.getElementById("audio_validate");
    var form = document.getElementById("question_form");
    var background_audio = document.getElementById("background_audio");
    var body = document.getElementsByTagName('body')[0];
    var filename = 'static/images/background_'   answered   ".jpg";
    body.style.backgroundImage = 'url(' filename ')';
    background_audio.pause();
    audio.play();
    setTimeout(function(){
        form.submit();
    }, 20000);
        return false;
  

Если я сохраняю return false, кнопки пусты (поэтому я думаю, что он отправляется с помощью JS, не зная, что кнопка была нажата)
Если я сохраняю значение return true, тайм-аут не выполняется, а также музыка не приостанавливается и не воспроизводится, но отправляется значение post; Мне нужна эта задержка в 20 секунд, чтобы правильно воспроизводить музыку и делать приостановки, поскольку это игра «кто хочет стать миллионером»

Комментарии:

1. Я посмотрел прямо в «Сеть» в своем веб-браузере, и отправляются только два последних значения

2. Что validateAnswer -то не так?

3. Форма работает для меня, но я удалил validateAnswer , поскольку вы не опубликовали эту функцию.

4. Я отредактировал свой вопрос, спасибо

Ответ №1:

Ваша функция JS перехватывает событие отправки (которое содержит данные о том, какая из кнопок была нажата) и вызывает form.submit вручную, поэтому значение кнопки не отправляется.

Простым способом исправить это было бы добавить еще одно скрытое поле, для которого вы бы установили значение кнопки, нажатой из вашей функции JS.

Комментарии:

1.Что за странность ! Я задал свою проблему другу, и он просто ответил на аналогичное решение, подобное вашему, вы правы!! вот что я сделал: var answered = document.activeElement.value; document.getElementById('given_answer').value = answered; Вывод: форма не знает, какая кнопка нажата, когда мы переопределяем функцию отправки, так что да, добавление скрытого ввода, а затем установка его значения делает трюк 🙂 спасибо!!

2. Да, подобные вещи могут быть очень запутанными 🙂 Добро пожаловать!