¿Enviar datos desde un cuadro de texto a Flask?

92

Me preguntaba si había una manera de tomar algo de un cuadro de texto en el HTML, introducirlo en el matraz y luego analizar esos datos con Python. Estaba pensando que esto podría involucrar algo de JS, pero podría estar equivocado. ¿Algunas ideas?

ollien
fuente
¿Por qué no utilizar un formulario HTML y publicarlo directamente? ¿O necesitas hacer esto de forma asincrónica? En ese caso, tendrá que leer un poco sobre AJAX. :-)
Martijn Pieters
1
Sé que puedo usar un formulario HTML, pero ¿cómo pasaría esa información a la aplicación del matraz?
Ollien

Respuestas:

154

A menos que desee hacer algo más complicado, introducir datos desde un formulario HTML en Flask es bastante fácil.

  • Cree una vista que acepte una solicitud POST ( my_form_post).
  • Acceda a los elementos del formulario en el diccionario 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 es la documentación de Flask sobre cómo acceder a los datos de la solicitud .

Si necesita formularios más complicados que necesitan validación, puede echar un vistazo a WTForms y cómo integrarlos con Flask .

Nota: a menos que tenga cualquier otra restricción, que realmente no necesita JavaScript en absoluto para enviar sus datos (aunque se puede usar).

pachá
fuente
1
Oye, esto funcionó, una vez, pero ahora arroja un error 500, ¿alguna idea?
Ollien
Debería estar funcionando bien ... Ponga app.debug = Truejusto antes app.run()para que obtenga la excepción y el seguimiento del error.
pacha
Sí, me olvidé de eso, fui un idiota y olvidé poner mi HTML en mi carpeta de plantillas.
Ollien
Perdí un poco de tiempo tratando de hacer esto con un área de texto más grande en lugar de un cuadro de texto si alguien necesita hacer esto con Flask, la solución está aquí
cardamomo
@cardamomo Realmente no entiendo lo que quieres decir. El uso de un área de texto o una entrada de tipo texto no cambia la solución de ninguna manera (la que está vinculando es exactamente la misma que esta). No tiene que cambiar el lado de Python, simplemente reemplace <input type="text" name="text">por <textarea name="text"></textarea>y debería estar bien.
pacha
9

Declare un extremo de Flask para aceptar el tipo de entrada POST y luego realice los pasos necesarios. Utilice jQuery para publicar los datos.

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
fuente
2

Toda la interacción entre el servidor (su aplicación de matraz) y el cliente (navegador) se realiza por solicitud y respuesta. Cuando el usuario presiona el botón enviar en su formulario, su navegador envía una solicitud con este formulario a su servidor (aplicación de matraz), y puede obtener el contenido del formulario como:

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

Asumiendo que ya sabe cómo escribir una vista en Flaskque responde a una URL, crear uno que lee la request.postinformación. Para agregar los input boxdatos a esta publicación, cree un formulario en su página con el cuadro de texto. Entonces puedes usar jquerypara hacer

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

y luego publique en su vista de forma asincrónica usando algo como lo siguiente.

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

Esto funcionó para mí.

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
fuente