it-swarm-pt.tech

Qual é a causa do erro de solicitação incorreto ao enviar o formulário no aplicativo Flask?

Depois de ler muitos problemas de som semelhantes e os relevantes Flaskdocs, não consigo descobrir o que está gerando o seguinte erro ao enviar um formulário:

400 pedido incorreto

O navegador (ou proxy) enviou uma solicitação que este servidor não pôde entender.

Enquanto o formulário sempre é exibido corretamente, a solicitação incorreta acontece quando eu envio um formulário HTML vinculado a uma dessas funções:

@app.route('/app/business', methods=['GET', 'POST'])
def apply_business():
    if request.method == 'POST':    
        new_account = Business(name=request.form['name_field'], email=request.form['email_field'], account_type="business", 
            q1=request.form['q1_field'], q2=request.form['q2_field'], q3=request.form['q3_field'], q4=request.form['q4_field'], 
            q5=request.form['q5_field'], q6=request.form['q6_field'], q7=request.form['q7_field'],
            account_status="pending", time=datetime.datetime.utcnow())
        db.session.add(new_account)
        db.session.commit()
        session['name'] = request.form['name_field']    
        return redirect(url_for('success'))
    return render_template('application.html', accounttype="business")          

@app.route('/app/student', methods=['GET', 'POST'])
def apply_student():    
    if request.method == 'POST':    
        new_account = Student(name=request.form['name_field'], email=request.form['email_field'], account_type="student", 
            q1=request.form['q1_field'], q2=request.form['q2_field'], q3=request.form['q3_field'], q4=request.form['q4_field'], 
            q5=request.form['q5_field'], q6=request.form['q6_field'], q7=request.form['q7_field'], q8=request.form['q8_field'], 
            q9=request.form['q9_field'], q10=request.form['q10_field'],
            account_status="pending", time=datetime.datetime.utcnow())
        db.session.add(new_account)
        db.session.commit()
        session['name'] = request.form['name_field']    
        return redirect(url_for('success')) 
    return render_template('application.html', accounttype="student")

A parte relevante do HTML é

<html>
<head>
    <title>apply</title>
</head>
<body>
    {% if accounttype=="business" %}
    <form action="{{ url_for('apply_business') }}" method=post class="application_form">
    {% Elif accounttype=="student" %}
    <form action="{{ url_for('apply_student') }}" method=post class="application_form">     
    {% endif %} 
    <p>Full Name:</p>
    <input name="name_field" placeholder="First and Last">
    <p>Email Address:</p>
    <input name="email_field" placeholder="[email protected]">
    ...

O problema para a maioria das pessoas não era chamar GET ou POST, mas estou fazendo exatamente isso em ambas as funções, e verifiquei novamente se importei tudo o que é necessário, como from flask import request. Também consultei o banco de dados e confirmei que as adições do formulário não foram adicionadas.

No aplicativo Flask, eu estava solicitando campos de formulário que eram rotulados de forma ligeiramente diferente no formulário HTML. Manter os nomes consistentes é uma obrigação. Mais pode ser lido nesta questão Erro de envio de formulário, Flask

74
zch

A solução foi simples e descoberta nos comentários. Conforme abordado nesta questão, Formulário enviando erro, Flask , e apontado por Sean Vieira ,

... o problema é que Flask gera um erro HTTP quando não consegue encontrar uma chave nos argumentos e nos dicionários de formulário. O que Flask assume por padrão é que se você está pedindo uma chave particular e não está lá, então algo ficou de fora da solicitação e a solicitação inteira é inválida.

Em outras palavras, se apenas um elemento de formulário solicitado em Python não puder ser encontrado em HTML, a solicitação POST não será válida e o erro será exibido, no meu caso, sem irregularidades no traceback. Para mim, foi uma falta de consistência com a ortografia: no HTML, rotulei várias entradas de formulário

<input name="question1_field" placeholder="question one">

enquanto em Python, quando havia um POST chamado, eu pego um formulário inexistente com

request.form['question1']

considerando que, para ser consistente com os nomes dos meus formulários HTML, precisava ser

request.form['question1_field']

Eu espero que isso ajude.

128
zch