Envío de datos desde un formulario HTML a un script de Python en Flask

84

Tengo el siguiente código en mi secuencia de comandos de Python:

def cmd_wui(argv, path_to_tx):
    """Run a web UI."""
    from flask import Flask, flash, jsonify, render_template, request
    import webbrowser
    app = Flask(__name__)


    @app.route('/tx/index/')
    def index():
        """Load start page where you select your project folder
        or load history projects from local DB."""
        from txclib import get_version
        txc_version = get_version()
        prj = project.Project(path_to_tx)

        # Let's create a resource list from our config file
        res_list = []
        prev_proj = ''
        for idx, res in enumerate(prj.get_resource_list()):
                hostname = prj.get_resource_host(res)
        username, password = prj.getset_host_credentials(hostname)
        return render_template('init.html', txc_version=txc_version, username=username)

Además, tengo un formulario HTML en init.html:

<form>
<input type="text" id="projectFilepath" size="40" placeholder="Spot your project files">
<input type="button" id="spotButton" value="Spot">
</form>

¿Cómo puedo pasar la entrada del usuario de "projectFilepath" cuando un usuario hace clic en "spotButton" en una variable en mi script de Python?

Soy nuevo en Python y Flask, así que perdóname si cometo algún error.

Mpampinos Holmens
fuente
1
Su projectFilepathentrada debe tener un nameatributo establecido, luego puede acceder al valor en request.args.value_of_name(o request.form.value_of_namesi realiza una POSTsolicitud.
Sean Vieira
2
Quería resaltar la sutileza de que está usando el idatributo en la <input>etiqueta, mientras que las respuestas a continuación usan name. namees lo que quieres, ya que eso es lo que aparece como claves en request.form.
Trenton

Respuestas:

154

La formetiqueta necesita algunos atributos establecidos:

  1. action: La URL a la que se envían los datos del formulario al enviarlos. Generarlo con url_for. Se puede omitir si la misma URL maneja mostrar el formulario y procesar los datos.
  2. method="post": Envía los datos como datos de formulario con el método POST. Si no se proporciona, o se establece explícitamente en get, los datos se envían en la cadena de consulta ( request.args) con el método GET en su lugar.
  3. enctype="multipart/form-data": Cuando el formulario contiene entradas de archivo, debe tener esta codificación establecida; de lo contrario, los archivos no se cargarán y Flask no los verá.

La inputetiqueta necesita un nameparámetro.

Agregue una vista para manejar los datos enviados, que está request.formbajo la misma clave que la entrada name. Cualquier entrada de archivo estará en formato request.files.

@app.route('/handle_data', methods=['POST'])
def handle_data():
    projectpath = request.form['projectFilepath']
    # your code
    # return a response

Establezca el formulario actionen la URL de esa vista usando url_for:

<form action="{{ url_for('handle_data') }}" method="post">
    <input type="text" name="projectFilepath">
    <input type="submit">
</form>
codecool
fuente
7
methodes en realidad opcional, por defecto GET. De lo contrario, estás en el clavo.
Sean Vieira
4
Siendo un novato (literalmente primer día de trabajo en el frasco), no me di cuenta al principio que uno debe hacerfrom flask import Flask, request
CodeFinity
3
Prefiero usar en request.form.get('projectFilepath')lugar de request.form['projectFilepath']evitar obtener una excepción si se envía un valor nulo.
Ibrahim.H
2
Otra cosa a tener en cuenta es que url_forbusca la función con ese nombre, por lo que aquí debe nombrarse su vistahandle_data
TrigonaMinima
57

Necesita una vista de matraz que recibirá datos POST y un formulario HTML que los enviará.

from flask import request

@app.route('/addRegion', methods=['POST'])
def addRegion():
    ...
    return (request.form['projectFilePath'])
<form action="{{ url_for('addRegion') }}" method="post">
    Project file path: <input type="text" name="projectFilePath"><br>
    <input type="submit" value="Submit">
</form>
Dawid Drozd
fuente