Pergunta

Estou usando o Flask (vsn 0.8) e o Flask-WTF (vsn 0.5.2) (por exemplo, para analisar formulários) para criar um site bem simples.No entanto, não consigo fazer o Flask-WTF analisar corretamente meus resultados GET.

Meu código relevante é parecido com este:

@app.route("/result", methods=("GET", "POST"))
def submit():
    form = MyForm()
    print request.args
    print request.args.get('aws_id', None, type=str)
    print form.is_submitted()
    if form.validate_on_submit():
        flash('Success')
        aws_id = form.aws_id.data
    return render_template("index.html", form=form)

Se eu enviar meu formulário com um único campo chamado 'aws_id' com GET, obtenho a seguinte saída no console.

127.0.0.1 - - [19/Oct/2011 22:28:59] "GET /result?aws_id=test_string HTTP/1.1" 200 -
ImmutableMultiDict([('aws_id', u'test_string')])
test_string
False

Parece-me que o envio está funcionando corretamente, mas o Flask-WTF não está funcionando.Essencialmente, a maneira antiga de lidar com a saída de formulário funciona, o método request.args.get, mas os novos form.is_submitted e form.validate_on_submit não estão fazendo sua mágica bondade.

Alguma ideia?(WTF!)

Foi útil?

Solução

Mudei meu aplicativo para a raiz do meu site, excluí o que estava lá (= redundante) e adicionei request.form à classe MyForm.Isso parece consertar.Também foi necessário definir csrf_enabled como false.

@app.route("/", methods=("GET", "POST"))
def submit():
    form = MyForm(request.form, csrf_enabled=False)
    if form.validate_on_submit():
        print form.data

    return render_template("index.html", form=form)

Outras dicas

O método Form da classe is_submitted de Flask-WTF se parece com:

def is_submitted(self):
    """
    Checks if form has been submitted. The default case is if the HTTP
    method is **PUT** or **POST**.
    """

    return request and request.method in ("PUT", "POST")

E em seu __init__ tem este código, que normalmente garante que os dados do formulário sejam carregados automaticamente da solicitação do Flask:

    if formdata is _Auto:
        if self.is_submitted():
            formdata = request.form

Então está claro ... se você enviar o formulário por meio de GET, não obterá nenhum comportamento automático.Isso é compreensível porque, se for uma solicitação GET, não está claro se o formulário foi enviado ou se você estava apenas carregando a página.Isso além de quaisquer problemas de CSRF.

validate_on_submit também não funciona, pois também depende de is_submitted

O próprio Flask também não analisa os campos GET em request.form para você.

Você acaba tendo que fazer algo como:

form = MyForm(request.args, csrf_enabled=False)
if 'aws_id' in request.args and form.validate():
    flash('Success')
    aws_id = form.aws_id.data

(todos assumem que sua classe MyForm herda de from flask.ext.wtf import Form)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top