Introducción
WTForms es una biblioteca de Python que facilita la creación y validación de formularios web. En este módulo, aprenderás cómo integrar WTForms en tu aplicación Flask para manejar la validación de formularios de manera eficiente y segura.
Contenido
Instalación de WTForms
Para comenzar a usar WTForms, primero necesitas instalar la biblioteca. Puedes hacerlo utilizando pip
:
Creación de un Formulario Básico
Primero, vamos a crear un formulario básico utilizando WTForms. Supongamos que queremos crear un formulario de registro de usuario con campos para el nombre de usuario, correo electrónico y contraseña.
Paso 1: Configuración de Flask-WTF
En tu archivo principal de Flask (app.py
), configura Flask-WTF:
from flask import Flask, render_template, request from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, SubmitField from wtforms.validators import DataRequired, Email, Length app = Flask(__name__) app.config['SECRET_KEY'] = 'mysecretkey' # Resto del código de la aplicación
Paso 2: Definición del Formulario
Crea una clase para tu formulario en un archivo separado o en el mismo archivo app.py
:
class RegistrationForm(FlaskForm): username = StringField('Username', validators=[DataRequired(), Length(min=2, max=20)]) email = StringField('Email', validators=[DataRequired(), Email()]) password = PasswordField('Password', validators=[DataRequired(), Length(min=6)]) submit = SubmitField('Sign Up')
Paso 3: Renderización del Formulario en una Plantilla
Crea una plantilla HTML para renderizar el formulario. Por ejemplo, en templates/register.html
:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Register</title> </head> <body> <h1>Register</h1> <form method="POST" action=""> {{ form.hidden_tag() }} <p> {{ form.username.label }}<br> {{ form.username(size=32) }}<br> {% for error in form.username.errors %} <span style="color: red;">[{{ error }}]</span> {% endfor %} </p> <p> {{ form.email.label }}<br> {{ form.email(size=32) }}<br> {% for error in form.email.errors %} <span style="color: red;">[{{ error }}]</span> {% endfor %} </p> <p> {{ form.password.label }}<br> {{ form.password(size=32) }}<br> {% for error in form.password.errors %} <span style="color: red;">[{{ error }}]</span> {% endfor %} </p> <p>{{ form.submit() }}</p> </form> </body> </html>
Paso 4: Manejo del Formulario en la Vista
En tu archivo app.py
, crea una ruta para manejar el formulario:
@app.route('/register', methods=['GET', 'POST']) def register(): form = RegistrationForm() if form.validate_on_submit(): # Aquí puedes manejar el registro del usuario username = form.username.data email = form.email.data password = form.password.data return f'User {username} registered with email {email}!' return render_template('register.html', form=form) if __name__ == '__main__': app.run(debug=True)
Validación de Campos
WTForms proporciona una variedad de validadores que puedes usar para asegurarte de que los datos del formulario sean correctos. Aquí hay algunos validadores comunes:
DataRequired
: Asegura que el campo no esté vacío.Email
: Verifica que el campo contenga una dirección de correo electrónico válida.Length
: Verifica que el campo tenga una longitud dentro de un rango específico.
Puedes combinar estos validadores en los campos de tu formulario como se muestra en el ejemplo anterior.
Renderización de Formularios en Plantillas
La renderización de formularios en plantillas se realiza utilizando las etiquetas de Jinja2. Aquí hay un ejemplo de cómo renderizar un campo de formulario con sus errores:
<p> {{ form.username.label }}<br> {{ form.username(size=32) }}<br> {% for error in form.username.errors %} <span style="color: red;">[{{ error }}]</span> {% endfor %} </p>
Manejo de Errores de Validación
Cuando un formulario no pasa la validación, los errores se almacenan en el atributo errors
del formulario. Puedes iterar sobre estos errores en tu plantilla para mostrarlos al usuario.
Ejercicio Práctico
Ejercicio
Crea un formulario de inicio de sesión con los siguientes campos:
email
: Campo de correo electrónico con validación de dirección de correo.password
: Campo de contraseña con una longitud mínima de 6 caracteres.submit
: Botón de envío.
Solución
- Define el formulario en
app.py
:
class LoginForm(FlaskForm): email = StringField('Email', validators=[DataRequired(), Email()]) password = PasswordField('Password', validators=[DataRequired(), Length(min=6)]) submit = SubmitField('Login')
- Crea una plantilla para el formulario en
templates/login.html
:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Login</title> </head> <body> <h1>Login</h1> <form method="POST" action=""> {{ form.hidden_tag() }} <p> {{ form.email.label }}<br> {{ form.email(size=32) }}<br> {% for error in form.email.errors %} <span style="color: red;">[{{ error }}]</span> {% endfor %} </p> <p> {{ form.password.label }}<br> {{ form.password(size=32) }}<br> {% for error in form.password.errors %} <span style="color: red;">[{{ error }}]</span> {% endfor %} </p> <p>{{ form.submit() }}</p> </form> </body> </html>
- Maneja el formulario en la vista:
@app.route('/login', methods=['GET', 'POST']) def login(): form = LoginForm() if form.validate_on_submit(): email = form.email.data password = form.password.data return f'Logged in with email {email}!' return render_template('login.html', form=form)
Conclusión
En este módulo, aprendiste cómo usar WTForms para crear y validar formularios en Flask. Cubrimos la instalación de WTForms, la creación de formularios básicos, la validación de campos, la renderización de formularios en plantillas y el manejo de errores de validación. Con estos conocimientos, estarás mejor preparado para manejar la entrada de usuario en tus aplicaciones Flask de manera segura y eficiente.
En el próximo módulo, exploraremos cómo manejar la carga de archivos en Flask. ¡Sigue adelante!
Curso de Desarrollo Web con Flask
Módulo 1: Introducción a Flask
- ¿Qué es Flask?
- Configuración de tu Entorno de Desarrollo
- Creando tu Primera Aplicación Flask
- Entendiendo la Estructura de una Aplicación Flask
Módulo 2: Conceptos Básicos de Flask
- Enrutamiento y Mapeo de URLs
- Manejo de Métodos HTTP
- Renderizando Plantillas con Jinja2
- Trabajando con Archivos Estáticos
Módulo 3: Formularios y Entrada de Usuario
Módulo 4: Integración de Bases de Datos
- Introducción a Flask-SQLAlchemy
- Definiendo Modelos
- Realizando Operaciones CRUD
- Migraciones de Base de Datos con Flask-Migrate
Módulo 5: Autenticación de Usuarios
- Registro de Usuarios
- Inicio y Cierre de Sesión de Usuarios
- Hashing de Contraseñas
- Gestión de Sesiones de Usuario
Módulo 6: Conceptos Avanzados de Flask
- Blueprints para Aplicaciones Grandes
- Manejo de Errores
- Páginas de Error Personalizadas
- Registro y Depuración
Módulo 7: APIs RESTful con Flask
- Introducción a las APIs RESTful
- Creación de Endpoints RESTful
- Manejo de Datos JSON
- Autenticación para APIs
Módulo 8: Despliegue y Producción
- Configuración de Flask para Producción
- Despliegue en Heroku
- Despliegue en AWS
- Monitoreo y Optimización del Rendimiento
Módulo 9: Pruebas y Mejores Prácticas
- Pruebas Unitarias con Flask
- Pruebas de Integración
- Cobertura de Pruebas
- Mejores Prácticas para el Desarrollo con Flask