Flask Manejo de formularios

En Flask, el manejo de formularios es una necesidad común al construir aplicaciones web.

El procesamiento de datos de formularios implica recibir, validar y manejar los formularios enviados por el usuario. Flask proporciona funciones básicas de manejo de formularios, pero generalmente se combina con la extensión Flask-WTF para simplificar las operaciones y la validación de formularios.

  1. Manejo básico de formularios: Usarrequest.formpara obtener los datos del formulario.
  2. Uso de Flask-WTF: combinar WTForms para el manejo y la validación de formularios, simplificando las operaciones de formularios.
  3. Validación de formularios: usar validadores para garantizar la validez de los datos del formulario.
  4. Subida de archivos: procesar la subida y el guardado de archivos.
  5. Protección CSRF: garantizar que los formularios estén protegidos contra ataques de falsificación de solicitudes entre sitios.

1. Manejo básico de formularios

Flask ofrece una manera directa de manejar los datos de formularios, utilizando el objeto `request` para obtener los datos enviados.

Crear un formulario HTML

Código del archivo templates/form.html:

Ejemplo

<!DOCTYPE html>
<html>
<head>
    <title>Form Example</title>
</head>
<body>
    <form action="/submit" method="post">
        <label for="name">Name:</label>
        <input type="text" id="name" name="name">
        <br>
        <label for="email">Email:</label>
        <input type="email" id="email" name="email">
        <br>
        <input type="submit" value="Submit">
    </form>
</body>
</html>

action="../submit": Los datos del formulario se envían a la ruta /submit.

method="post": Se envían datos mediante el método POST.

Procesar los datos del formulario

Código del archivo app.py:

Ejemplo

from flask import Flask, render_template, request

app = Flask(__name__)

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

@app.route('/submit', methods=['POST'])
def submit():
    name = request.form.get('name')
    email = request.form.get('email')
    return f'Name: {name}, Email: {email}'

if __name__ == '__main__':
    app.run(debug=True)

request.form.get('name')yrequest.form.get('email'): Obtener los datos del formulario enviado.

2. Uso de la extensión Flask-WTF

Flask-WTF es una extensión que envuelve WTForms y proporciona funcionalidades de manejo y validación de formularios, haciendo que el manejo de formularios sea más sencillo y potente.

Instalar Flask-WTF

pip install flask-wtf
Configurar Flask-WTF

Código del archivo app.py:

Ejemplo

from flask import Flask, render_template, redirect, url_for
from flask_wtf import FlaskForm
from wtforms import StringField, EmailField, SubmitField
from wtforms.validators import DataRequired, Email

app = Flask(__name__)
app.secret_key = 'your_secret_key'  # Required for form protection

class MyForm(FlaskForm):
    name = StringField('Name', validators=[DataRequired()])
    email = EmailField('Email', validators=[DataRequired(), Email()])
    submit = SubmitField('Submit')

@app.route('/', methods=['GET', 'POST'])
def form():
    form = MyForm()
    if form.validate_on_submit():
        name = form.name.data
        email = form.email.data
        return f'Name: {name}, Email: {email}'
    return render_template('form.html', form=form)

if __name__ == '__main__':
    app.run(debug=True)

Crear una plantilla para admitir formularios Flask-WTF

Código del archivo templates/form.html:

Ejemplo

<!DOCTYPE html>
<html>
<head>
    <title>Form Example</title>
</head>
<body>
    <form method="post">
        {{ form.hidden_tag() }}
        <div>
            {{ form.name.label }}<br>
            {{ form.name(size=32) }}
        </div>
        <div>
            {{ form.email.label }}<br>
            {{ form.email(size=32) }}
        </div>
        <div>
            {{ form.submit() }}
        </div>
    </form>
</body>
</html>

{{ form.hidden_tag() }}: Genera un campo oculto para proteger el formulario contra ataques CSRF.

{{ form.name.label }}y{{ form.name(size=32) }}: Representa los campos del formulario y sus etiquetas.

3. Validación de formularios

Flask-WTF y WTForms ofrecen amplias funciones de validación de formularios. Puedes usar validadores integrados o validadores personalizados para garantizar la validez de los datos del formulario.

Ejemplo

from wtforms import Form, StringField, EmailField, SubmitField
from wtforms.validators import DataRequired, Email, Length

class MyForm(FlaskForm):
    name = StringField('Name', validators=[
        DataRequired(), Length(min=1, max=50)
    ])
    email = EmailField('Email', validators=[
        DataRequired(), Email()
    ])
    submit = SubmitField('Submit')
  • DataRequired(): Asegura que el campo no esté vacío.
  • Length(min=1, max=50): Limita la longitud mínima y máxima de la cadena.
  • Email(): Valida si el campo es una dirección de correo electrónico válida.

4. Subida de archivos

Flask también admite el manejo de subida de archivos. Los archivos subidos se puedenrequest.filesacceder.

Crear un formulario de subida de archivos

Código del archivo templates/upload.html:

Ejemplo

<!DOCTYPE html>
<html>
<head>
    <title>Upload File</title>
</head>
<body>
    <form action="/upload" method="post" enctype="multipart/form-data">
        <label for="file">File:</label>
        <input type="file" id="file" name="file">
        <br>
        <input type="submit" value="Upload">
    </form>
</body>
</html>

enctype="multipart/form-data": Especifica el tipo de codificación de los datos del formulario, lo que permite la subida de archivos.

Procesar la subida de archivos

Código del archivo app.py:

Ejemplo

from flask import Flask, request, redirect, url_for

app = Flask(__name__)
app.secret_key = 'your_secret_key'

@app.route('/upload', methods=['POST'])
def upload():
    file = request.files.get('file')
    if file:
        filename = file.filename
        file.save(f'uploads/{filename}')
        return f'File uploaded successfully: {filename}'
    return 'No file uploaded'

if __name__ == '__main__':
    app.run(debug=True)

request.files.get('file'): Obtiene el objeto del archivo subido.

file.save(f'uploads/{filename}'): Guarda el archivo en el directorio especificado.

5. Protección CSRF

Flask-WTF proporciona automáticamente protección CSRF para los formularios. Necesitas configurar una clave secreta para habilitar la protección CSRF e incluir un token CSRF oculto en la plantilla.

Configurar la protección CSRF

app.secret_key = 'your_secret_key'

Añade el token CSRF en la plantilla:

Ejemplo

<form method="post">
    {{ form.hidden_tag() }}
    <!-- Form fields here -->
</form>
Otras extensiones