Подтвердить что ты не робот

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

Существует форма с двумя <input type="submit">. Но когда я его отправляю, второй 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():
     ...
4b9b3361

Ответ 1

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

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

  • Используйте метод request.form .get:

    if request.form.get('add', None) == "Like":
        # Like happened
    elif request.form.get('remove', None) == "Dislike":
        # Dislike happened
    
  • Используйте те же атрибуты 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.
    

Ответ 2

Вы можете начать с публикации фактического исключения, которое выбрасывается вместо этого более или менее бесполезного вывода с вашего веб-сервера. В любом случае, я думаю, вы должны проверить, находятся ли ключи "добавить" и "удалить" в request.form dict, т.е.:

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 dict не содержит ключа с именем add.