2 usuarios conectados

Desarrollo web con Python. Formularios web

Comparte esto

Ahora vamos a explorar el tema de los formularios web, un componente esencial para la interacción con los usuarios en la mayoría de las aplicaciones web. Los formularios permiten a los usuarios enviar datos al servidor, ya sea para registrarse, iniciar sesión, realizar búsquedas, enviar comentarios, completar pedidos, etc.

¿Qué son los Formularios Web?

Un formulario web es un conjunto de elementos interactivos (campos de texto, botones, listas desplegables, casillas de verificación, etc.) que permiten a los usuarios introducir y enviar información a un servidor web. Están definidos en HTML utilizando la etiqueta <form> y sus elementos de entrada asociados (<input>, <textarea>, <select>, etc.).

Proceso de Envío y Procesamiento de Formularios:

  1. El Usuario Interactúa: El usuario introduce datos en los campos del formulario y hace clic en el botón de envío.
  2. El Navegador Envía la Petición: El navegador empaqueta los datos del formulario y los envía al servidor como parte de una petición HTTP (generalmente utilizando los métodos GET o POST).
  3. El Servidor Recibe la Petición: El servidor web (a través de tu framework Python) recibe la petición HTTP que contiene los datos del formulario.
  4. El Framework Procesa los Datos: Tu framework Python (Flask, Django, FastAPI, etc.) analiza los datos del formulario. Esto puede incluir:
  5. El Servidor Envía una Respuesta: El servidor genera una respuesta HTTP que puede incluir una página de confirmación, un mensaje de error o la redirección a otra página.
  6. El Navegador Muestra la Respuesta: El navegador del usuario recibe y renderiza la respuesta del servidor.

Manejo de Formularios en Frameworks Web Python:

Los frameworks web Python proporcionan herramientas para simplificar el proceso de creación, envío y procesamiento de formularios:

Flask:

Ejemplo con Flask y Flask-WTF:

Python
from flask import Flask, render_template, request, flash, redirect, url_for
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, SubmitField
from wtforms.validators import DataRequired, Email, EqualTo

app = Flask(__name__)
app.config['SECRET_KEY'] = 'tu_clave_secreta'  # ¡Importante para la seguridad!

class RegistroForm(FlaskForm):
    nombre = StringField('Nombre', validators=[DataRequired()])
    email = StringField('Correo Electrónico', validators=[DataRequired(), Email()])
    password = PasswordField('Contraseña', validators=[DataRequired()])
    confirm_password = PasswordField('Confirmar Contraseña', validators=[DataRequired(), EqualTo('password')])
    aceptar_terminos = BooleanField('Acepto los términos y condiciones')
    enviar = SubmitField('Registrarse')

@app.route('/registro', methods=['GET', 'POST'])
def registro():
    form = RegistroForm()
    if form.validate_on_submit():
        flash(f'Cuenta creada para {form.nombre.data}!', 'success')
        return redirect(url_for('index'))
    return render_template('registro.html', form=form)

@app.route('/')
def index():
    return '¡Página principal!'

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

En la plantilla registro.html:

HTML
<!DOCTYPE html>
<html>
<head>
    <title>Registro</title>
</head>
<body>
    <h1>Registro</h1>
    <form method="POST" action="">
        {{ form.csrf_token }}
        <p>{{ form.nombre.label }} {{ form.nombre() }}
           {% for error in form.nombre.errors %}
               <span style="color: red;">[{{ error }}]</span>
           {% endfor %}
        </p>
        <p>{{ form.email.label }} {{ form.email() }}
           {% for error in form.email.errors %}
               <span style="color: red;">[{{ error }}]</span>
           {% endfor %}
        </p>
        <p>{{ form.password.label }} {{ form.password() }} {{ form.confirm_password.label }} {{ form.confirm_password() }}
           {% for error in form.password.errors %}
               <span style="color: red;">[{{ error }}]</span>
           {% endfor %}
        </p>
        <p>{{ form.aceptar_terminos.label }} {{ form.aceptar_terminos() }}</p>
        <p>{{ form.enviar() }}</p>
    </form>
</body>
</html>

Django:

Ejemplo con Django:

En forms.py de tu aplicación Django:

Python
from django import forms
from django.core.validators import EmailValidator

class ContactoForm(forms.Form):
    nombre = forms.CharField(max_length=100)
    email = forms.CharField(validators=[EmailValidator()])
    mensaje = forms.CharField(widget=forms.Textarea)
    enviar_copia = forms.BooleanField(required=False)

En views.py:

Python
from django.shortcuts import render, redirect
from .forms import ContactoForm

def contacto(request):
    if request.method == 'POST':
        form = ContactoForm(request.POST)
        if form.is_valid():
            nombre = form.cleaned_data['nombre']
            email = form.cleaned_data['email']
            mensaje = form.cleaned_data['mensaje']
            enviar_copia = form.cleaned_data['enviar_copia']
            # Aquí podrías enviar un correo electrónico o guardar en la base de datos
            return redirect('contacto_exito')
    else:
        form = ContactoForm()
    return render(request, 'contacto.html', {'form': form})

def contacto_exito(request):
    return render(request, 'contacto_exito.html')

En la plantilla contacto.html:

HTML
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Enviar</button>
</form>

FastAPI:

Conceptos Clave en el Manejo de Formularios Web:

El manejo eficiente y seguro de formularios web es crucial para construir aplicaciones web interactivas y fáciles de usar. Los frameworks Python proporcionan herramientas poderosas para simplificar este proceso. ¿Te gustaría que profundicemos en la validación de formularios, la seguridad o cómo se manejan los formularios en un framework específico?