Enviar dados de uma caixa de texto para o Flask?

92

Eu queria saber se havia uma maneira de pegar algo de uma caixa de texto no HTML, colocá-lo em um frasco e, em seguida, analisar esses dados com Python. Eu estava pensando que isso poderia envolver algum JS, mas posso estar errado. Alguma ideia?

ollien
fonte
Por que não usar um formulário HTML e postá-lo diretamente? Ou você precisa fazer isso de forma assíncrona? Nesse caso, você terá que fazer algumas leituras sobre AJAX. :-)
Martijn Pieters
1
Eu sei que posso usar um formulário HTML, mas como eu passaria essa informação para o aplicativo flask?
ollien

Respostas:

154

A menos que você queira fazer algo mais complicado, alimentar dados de um formulário HTML no Flask é muito fácil.

  • Crie uma visualização que aceite uma solicitação POST ( my_form_post).
  • Acesse os elementos do formulário no dicionário request.form.

templates/my-form.html:

<form method="POST">
    <input name="text">
    <input type="submit">
</form>
from flask import Flask, request, render_template

app = Flask(__name__)

@app.route('/')
def my_form():
    return render_template('my-form.html')

@app.route('/', methods=['POST'])
def my_form_post():
    text = request.form['text']
    processed_text = text.upper()
    return processed_text

Esta é a documentação do Flask sobre como acessar os dados da solicitação .

Se você precisa de formulários mais complicados que precisam de validação, você pode dar uma olhada em WTForms e como integrá-los ao Flask .

Nota: a menos que você tiver quaisquer outras restrições, você realmente não precisa ter o JavaScript em tudo para enviar seus dados (embora você pode usá-lo).

pacha
fonte
1
Ei, isso funcionou uma vez, mas agora gera um erro 500, alguma ideia?
ollien
Deve estar funcionando bem ... Coloque um app.debug = Truepouco antes app.run()para obter a exceção e o rastreamento do erro.
pacha
Sim, eu esqueci disso, fui um idiota e esqueci de colocar meu HTML na minha pasta de modelos.
ollien
Perdi um pouco de tempo tentando fazer isso com uma área de texto maior em vez de caixa de texto. Se alguém precisar fazer isso com o Flask, a solução está aqui
cardamomo
@cardamom Eu realmente não entendi o que você quis dizer. Usar uma textarea ou uma entrada do tipo text não muda a solução de forma alguma (aquela que você está vinculando é exatamente a mesma que esta). Você não precisa mudar o lado do Python, apenas substitua <input type="text" name="text">por <textarea name="text"></textarea>e você estará bem.
pacha
9

Declare um ponto de extremidade Flask para aceitar o tipo de entrada POST e execute as etapas necessárias. Use jQuery para postar os dados.

from flask import request

@app.route('/parse_data', methods=['GET', 'POST'])
def parse_data(data):
    if request.method == "POST":
         #perform action here
var value = $('.textbox').val();
$.ajax({
  type: 'POST',
  url: "{{ url_for('parse_data') }}",
  data: JSON.stringify(value),
  contentType: 'application/json',
  success: function(data){
    // do something with the received data
  }
});
Kracekumar
fonte
2

Toda interação entre o servidor (seu aplicativo Flask) e o cliente (navegador) por meio de solicitação e resposta. Quando o usuário clica no botão enviar em seu formulário, seu navegador envia a solicitação com este formulário para o seu servidor (aplicativo flask), e você pode obter o conteúdo do formulário como:

request.args.get('form_name')
Denis
fonte
1

Supondo que você já sabe como escrever uma visão em Flaskque responde a um url, criar um que lê o request.postdados. Para adicionar a input boxesses dados de postagem, crie um formulário em sua página com a caixa de texto. Você pode então usar jquerypara fazer

var data = $('#<form-id>').serialize()

e, em seguida, poste em sua visualização de forma assíncrona usando algo como o abaixo.

$.post('<your view url>', function(data) {
  $('.result').html(data);
});
Pratik Mandrekar
fonte
0

Isso funcionou para mim.

def parse_data():
    if request.method == "POST":
        data = request.get_json()
        print(data['answers'])
        return render_template('output.html', data=data)
$.ajax({
      type: 'POST',
      url: "/parse_data",
      data: JSON.stringify({values}),
      contentType: "application/json;charset=utf-8",
      dataType: "json",
      success: function(data){
        // do something with the received data
      }
    });
Anurag Sharma
fonte