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.
- Manejo básico de formularios: Usar
request.formpara obtener los datos del formulario. - Uso de Flask-WTF: combinar WTForms para el manejo y la validación de formularios, simplificando las operaciones de formularios.
- Validación de formularios: usar validadores para garantizar la validez de los datos del formulario.
- Subida de archivos: procesar la subida y el guardado de archivos.
- 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
<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
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-wtfConfigurar Flask-WTF
Código del archivo app.py:
Ejemplo
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
<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.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
<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
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.hidden_tag() }}
<!-- Form fields here -->
</form>