Ошибка отправки формы, колба - PullRequest
55 голосов
/ 18 декабря 2011

Есть форма с двумя <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 ]

87 голосов
/ 19 декабря 2011

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

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

  1. Использование request.form '.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.
    
3 голосов
/ 18 декабря 2011

Вы должны проверить, есть ли клавиши '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'))

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...