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


есть форма с двумя <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'))
...

первый submit(add) работает хорошо, но второй (remove)...:

Неверный Запрос браузер(или прокси) послал запрос, что этот сервер не мог понять.

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

UPD:

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

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

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'.