it-swarm-pt.tech

Erro ao enviar formulário, Flask

Existe um formulário com dois <input type="submit">. Mas quando estou enviando, o segundo envio causa erro.

layout :

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

O primeiro envio (adição) funciona bem, mas o segundo (remoção) ...:

Solicitação incorreta O navegador (ou proxy) enviou uma solicitação que este servidor não conseguiu entender.

Como posso corrigir este erro?

ATUALIZE:

Era bem simples: request.form retorna ImmutableMultiDict:

... 
if 'Like' in request.form.values():
     ...
Elif 'Dislike' in request.form.values():
     ...
55
dimazubrik

Como o @Blubber aponta, o problema é que Flask gera um erro HTTP quando falha em encontrar uma chave nos dicionários args e form. O que Flask assume por padrão é que, se você está solicitando uma chave específica e ela não está lá, algo foi deixado de fora da solicitação e a solicitação inteira é inválida.

Existem outras duas maneiras de lidar com a sua situação:

  1. Use o método request.form 's .get:

    if request.form.get('add', None) == "Like":
        # Like happened
    Elif request.form.get('remove', None) == "Dislike":
        # Dislike happened
    
  2. Use o mesmo atributo name para os dois elementos de envio:

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

Você deve verificar se as teclas 'add' e 'remove' estão no ditado 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'))

Quando você clica em Curtir, não falha porque a primeira condição é atendida e, portanto, a segunda nunca é verificada. Mas se o botão Não gostar for clicado, a primeira condição gerará uma exceção KeyError porque request.form não contém uma chave chamada 'add'.

3
Blubber