Ошибка отправки формы, колба

Есть форма с двумя <input type="submit">, Но когда я отправляю его, вторая отправка вызывает ошибку.

макет:

<form action="{{ url_for('index') }}" method="post">
    <input type="submit" name="add" value="Like">
    <input type="submit" name="remove" value="Dislike">
</form>

main.py:

...
if request.method == 'POST':
    if request.form['add']:
        return redirect(url_for('index'))
    elif request.form['remove']:
        return redirect(url_for('index'))
...

Первая передача (добавить) работает хорошо, а вторая (удалить)...:

Плохой запрос Браузер (или прокси) отправил запрос, который этот сервер не может понять.

Как я могу исправить эту ошибку?

UPD:

Это было довольно просто: request.form возвращает ImmutableMultiDict:

... 
if 'Like' in request.form.values():
     ...
elif 'Dislike' in request.form.values():
     ...

2 ответа

Решение

Как указывает @Blubber, проблема в том, что Flask выдает ошибку HTTP, когда не удается найти ключ в args а также form словари. По умолчанию Flask предполагает, что если вы запрашиваете определенный ключ, а его там нет, значит, что-то осталось из запроса, и весь запрос является недействительным.

Есть два других хороших способа справиться с вашей ситуацией:

  1. использование request.form"s .get метод:

    if request.form.get('add', None) == "Like":
        # Like happened
    elif request.form.get('remove', None) == "Dislike":
        # Dislike happened
    
  2. Используйте то же самое name атрибут для обоих отправляемых элементов:

    <input type="submit" name="action" value="Like">
    <input type="submit" name="action" value="Dislike">
    
    # and in your code
    if request.form["action"] == "Like":
        # etc.
    

Вы должны проверить, действительно ли 'add' а также 'remove' ключи находятся в request.form ДИКТ.

if request.method == 'POST':
    if 'add' in request.form:
        return redirect(url_for('index'))
    elif 'remove' in request.form:
        return redirect(url_for('index'))

Когда вы нажимаете " Мне нравится", это не дает сбоя, потому что первое условие выполнено и, следовательно, второе никогда не проверяется. Но если нажать кнопку "Не нравится", это первое условие KeyError исключение, потому что request.form не содержит ключ с именем 'add',

Вместо <input type="submit"> Использовать <button type="submit">. У меня такая же ошибка, как и у вас, и я пробовал много решений, но ничего из этого не работает

Другие вопросы по тегам