Dominio de Flask: Jinja2, Gestión de Peticiones y Carga de Archivos

El motor de plantillas Jinja2 es el estándar en Flask para generar contenido dinámico. Utiliza delimitadores específicos para separar la lógica de programación del marcado HTML:

  • {% ... %}: Estructuras de control como bucles y condicionales.
  • {{ ... }}: Expresiones para imprimir resultados en la salida del template.
  • {# ... #}: Comentarios internos que no se renderizan en el navegador.
  • # ... ##: Sintaxis para santencias de una sola línea.

Ejemplo de una estructura condicional en Jinja2:

{% if nota_final >= 60 %}
   <div class="alert success">¡Felicidades, has aprobado!</div>
{% else %}
   <div class="alert danger">Lo sentimos, debes repetir el curso.</div>
{% endif %}

Para iterar sobre estructuras de datos, como diccionarios, se utiliza el bucle for dentro de la plantilla:

<table border="1">
   <thead>
       <tr>
           <th>Atributo</th>
           <th>Descripción</th>
       </tr>
   </thead>
   <tbody>
       {% for campo, detalle in metadata.items() %}
       <tr>
           <td>{{ campo }}</td>
           <td>{{ detalle }}</td>
       </tr>
       {% endfor %}
   </tbody>
</table>

El Objeto Request en Flask

Toda la información que viaja desde el cliente hacia el servidor se encapsula en el objeto request. Para utilizarlo, es necesario importarlo desde la librería principal de Flask.

Sus atributos más relevantes incluyen:

  • form: Diccionario que contiene los parámetros anviados mediante un formulario POST.
  • args: Parámetros extraídos de la cadena de consulta (query string) en la URL.
  • cookies: Información almacenada en las cookies del navegador.
  • files: Datos binarios relacionados con la subida de archivos.
  • method: El verbo HTTP utilizado (GET, POST, PUT, DELETE, etc.).

Redireccionamiento y Control de Flujo

La función redirect() permite enviar al usuario a una ruta distinta. Comúnmente se combina con url_for() para generar URLs dinámicas basadas en el nombre de la función de la vista.

from flask import Flask, redirect, url_for, render_template, request

app = Flask(__name__)

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

@app.route('/validar', methods=['POST', 'GET'])
def autenticar():
   if request.method == 'POST':
       usuario = request.form.get('txt_usuario')
       if usuario == 'root':
           return redirect(url_for('panel_principal'))
   
   return redirect(url_for('inicio'))

@app.route('/dashboard')
def panel_principal():
   return "Bienvenido al sistema administrativo"

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

Procesamiento de Archivos en el Servidor

Para habilitar la carga de archivos, el formulario HTML debe declarar el atributo enctype="multipart/form-data". En el backend, Flask accede a estos archivos mediante request.files.

Es una práctica de seguriadd fundamental utilizar secure_filename de la librería Werkzeug para limpiar el nombre del archivo antes de guardarlo en el sistema de archivos del servidor.

Configuraciones clave:

  • UPLOAD_FOLDER: Define la ruta de destino de las cargas.
  • MAX_CONTENT_LENGTH: Limita el tamaño máximo permitido para los archivos (en bytes).

Ejemplo de implementación para subida de imágenes:

<!-- form_subida.html -->
<form action="/procesar-carga" method="POST" enctype="multipart/form-data">
   <input type="file" name="archivo_adjunto" />
   <button type="submit">Subir Documento</button>
</form>
from flask import Flask, render_template, request
from werkzeug.utils import secure_filename
import os

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = './uploads'

@app.route('/subir')
def vista_subida():
   return render_template('form_subida.html')

@app.route('/procesar-carga', methods=['POST'])
def gestionar_archivo():
   if 'archivo_adjunto' in request.files:
       f = request.files['archivo_adjunto']
       nombre_limpio = secure_filename(f.filename)
       f.save(os.path.join(app.config['UPLOAD_FOLDER'], nombre_limpio))
       return 'El archivo se ha almacenado correctamente'
   return 'No se seleccionó ningún archivo'

Extensiones Populares del Ecosistema

Flask es un micro-framework que puede expandir sus capacidades mediante extensiones:

  • Flask-Mail: Simplifica el envío de correos electrónicos mediante SMTP.
  • Flask-WTF: Integración con WTForms para validación robusta de formularios.
  • Flask-SQLAlchemy: Facilita el uso de este ORM para interactuar con bases de datos relacionales.
  • Flask-Sijax: Permite implementar funcionalidades AJAX de forma sencilla en la aplicación.

Etiquetas: Flask Jinja2 Python werkzeug web-development

Publicado el 8-1 10:55