En este módulo, abordaremos algunas de las mejores prácticas que debes seguir al desarrollar aplicaciones web con Flask. Estas prácticas te ayudarán a escribir código más limpio, mantenible y seguro, y a crear aplicaciones más robustas y eficientes.

  1. Estructura del Proyecto

Mantén una Estructura de Proyecto Clara y Organizada

Una estructura de proyecto bien organizada facilita la navegación y el mantenimiento del código. Aquí hay un ejemplo de una estructura de proyecto típica para una aplicación Flask:

my_flask_app/
│
├── app/
│   ├── __init__.py
│   ├── models.py
│   ├── views.py
│   ├── forms.py
│   ├── templates/
│   │   └── ...
│   ├── static/
│   │   └── ...
│   └── blueprints/
│       └── ...
│
├── migrations/
│   └── ...
│
├── tests/
│   └── ...
│
├── config.py
├── requirements.txt
└── run.py

Explicación de la Estructura

  • app/: Contiene la aplicación principal y sus componentes.
    • init.py: Inicializa la aplicación Flask y registra los blueprints.
    • models.py: Define los modelos de la base de datos.
    • views.py: Contiene las vistas y rutas de la aplicación.
    • forms.py: Define los formularios de la aplicación.
    • templates/: Contiene las plantillas HTML.
    • static/: Contiene archivos estáticos como CSS, JavaScript e imágenes.
    • blueprints/: Contiene los blueprints para modularizar la aplicación.
  • migrations/: Contiene los archivos de migración de la base de datos.
  • tests/: Contiene los archivos de prueba.
  • config.py: Contiene la configuración de la aplicación.
  • requirements.txt: Lista de dependencias del proyecto.
  • run.py: Script para ejecutar la aplicación.

  1. Configuración

Usa Configuraciones Separadas para Diferentes Entornos

Es una buena práctica tener configuraciones separadas para desarrollo, pruebas y producción. Puedes lograr esto utilizando diferentes archivos de configuración y cargándolos según el entorno.

# config.py
import os

class Config:
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'you-will-never-guess'
    SQLALCHEMY_TRACK_MODIFICATIONS = False

class DevelopmentConfig(Config):
    DEBUG = True
    SQLALCHEMY_DATABASE_URI = 'sqlite:///dev.db'

class TestingConfig(Config):
    TESTING = True
    SQLALCHEMY_DATABASE_URI = 'sqlite:///test.db'

class ProductionConfig(Config):
    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or 'sqlite:///prod.db'

Carga la Configuración Correcta

# __init__.py
from flask import Flask
from config import DevelopmentConfig, TestingConfig, ProductionConfig

def create_app(config_class=DevelopmentConfig):
    app = Flask(__name__)
    app.config.from_object(config_class)
    
    # Inicializa extensiones, blueprints, etc.
    
    return app

  1. Seguridad

Protege Contra CSRF

Utiliza la extensión Flask-WTF para proteger tus formularios contra ataques de Cross-Site Request Forgery (CSRF).

# __init__.py
from flask_wtf.csrf import CSRFProtect

csrf = CSRFProtect()

def create_app(config_class=DevelopmentConfig):
    app = Flask(__name__)
    app.config.from_object(config_class)
    
    csrf.init_app(app)
    
    return app

Hashing de Contraseñas

Nunca almacenes contraseñas en texto plano. Utiliza una biblioteca como werkzeug.security para hashear contraseñas.

from werkzeug.security import generate_password_hash, check_password_hash

hashed_password = generate_password_hash('mysecretpassword')
is_correct = check_password_hash(hashed_password, 'mysecretpassword')

  1. Manejo de Errores

Maneja Errores de Forma Global

Define manejadores de errores globales para capturar y manejar excepciones comunes.

# __init__.py
def create_app(config_class=DevelopmentConfig):
    app = Flask(__name__)
    app.config.from_object(config_class)
    
    @app.errorhandler(404)
    def not_found_error(error):
        return render_template('404.html'), 404
    
    @app.errorhandler(500)
    def internal_error(error):
        return render_template('500.html'), 500
    
    return app

  1. Pruebas

Escribe Pruebas Unitarias y de Integración

Asegúrate de escribir pruebas para tu aplicación. Utiliza unittest o pytest para crear pruebas unitarias y de integración.

# test_app.py
import unittest
from app import create_app, db
from app.models import User

class UserModelCase(unittest.TestCase):
    def setUp(self):
        self.app = create_app(TestingConfig)
        self.app_context = self.app.app_context()
        self.app_context.push()
        db.create_all()
    
    def tearDown(self):
        db.session.remove()
        db.drop_all()
        self.app_context.pop()
    
    def test_password_hashing(self):
        u = User(username='susan')
        u.set_password('cat')
        self.assertFalse(u.check_password('dog'))
        self.assertTrue(u.check_password('cat'))

if __name__ == '__main__':
    unittest.main()

  1. Documentación

Documenta tu Código

Utiliza docstrings y comentarios para documentar tu código. Esto facilita la comprensión y el mantenimiento del código.

def create_app(config_class=DevelopmentConfig):
    """
    Crea y configura la aplicación Flask.
    
    Args:
        config_class (class): La clase de configuración a utilizar.
    
    Returns:
        app (Flask): La instancia de la aplicación Flask.
    """
    app = Flask(__name__)
    app.config.from_object(config_class)
    
    return app

Conclusión

Seguir estas mejores prácticas te ayudará a desarrollar aplicaciones Flask más robustas, seguras y mantenibles. A medida que avances en tu carrera como desarrollador, encontrarás que adherirse a estas prácticas no solo mejora la calidad de tu código, sino que también facilita la colaboración con otros desarrolladores y la escalabilidad de tus proyectos. ¡Continúa aprendiendo y aplicando estas prácticas para convertirte en un desarrollador Flask más eficiente y efectivo!

Curso de Desarrollo Web con Flask

Módulo 1: Introducción a Flask

Módulo 2: Conceptos Básicos de Flask

Módulo 3: Formularios y Entrada de Usuario

Módulo 4: Integración de Bases de Datos

Módulo 5: Autenticación de Usuarios

Módulo 6: Conceptos Avanzados de Flask

Módulo 7: APIs RESTful con Flask

Módulo 8: Despliegue y Producción

Módulo 9: Pruebas y Mejores Prácticas

Módulo 10: Extensiones y Ecosistema de Flask

© Copyright 2024. Todos los derechos reservados