Flask: Guía Completa para Empezar con Python

Alejandro

Aprende a configurar y crear proyectos con Flask, el microframework web ligero y flexible de Python. Desde la instalación hasta el despliegue en producción.

Introducción a Flask

Flask es un microframework web ligero y flexible para Python. A diferencia de Django, Flask es minimalista y te da total libertad para elegir cómo estructurar tu aplicación. Es ideal para proyectos pequeños a medianos, APIs REST y prototipos rápidos.

¿Por qué elegir Flask?

  • Simplicidad: Fácil de aprender y usar, perfecto para principiantes.
  • Flexibilidad: No impone una estructura específica, puedes organizar tu código como prefieras.
  • Ligero: Mínimo overhead, solo incluye lo esencial.
  • Extensible: Gran ecosistema de extensiones para añadir funcionalidades.
  • Ideal para APIs: Perfecto para construir APIs REST rápidas.

Instalación y configuración

Instalación básica

# Crear entorno virtual
python -m venv venv
source venv/bin/activate  # En Windows: venv\Scripts\activate

# Instalar Flask
pip install flask

Estructura básica de un proyecto Flask

mi_proyecto/
├── app.py
├── requirements.txt
├── config.py
├── instance/
│   └── config.py
├── templates/
│   └── index.html
├── static/
│   ├── css/
│   ├── js/
│   └── images/
└── venv/

Cómo empezar un proyecto Flask

Paso 1: Crear la aplicación básica

Crea un archivo app.py:

from flask import Flask, render_template, request, jsonify

app = Flask(__name__)

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

@app.route('/api/data')
def get_data():
    return jsonify({'message': 'Hello from Flask API!'})

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

Paso 2: Configuración

Crea un archivo config.py:

import os

class Config:
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'dev-secret-key-change-in-production'
    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or 'sqlite:///app.db'
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    DEBUG = os.environ.get('FLASK_ENV') == 'development'

Paso 3: Estructura con Blueprints (Recomendado)

Para proyectos más grandes, usa Blueprints:

# app/__init__.py
from flask import Flask
from config import Config

def create_app(config_class=Config):
    app = Flask(__name__)
    app.config.from_object(config_class)
    
    # Registrar blueprints
    from app.main import bp as main_bp
    app.register_blueprint(main_bp)
    
    from app.api import bp as api_bp
    app.register_blueprint(api_bp, url_prefix='/api')
    
    return app

# app/main/__init__.py
from flask import Blueprint
bp = Blueprint('main', __name__)

from app.main import routes

# app/main/routes.py
from app.main import bp
from flask import render_template

@bp.route('/')
def index():
    return render_template('index.html')

Extensiones útiles de Flask

  • Flask-SQLAlchemy: ORM para bases de datos
  • Flask-Migrate: Migraciones de base de datos
  • Flask-Login: Autenticación de usuarios
  • Flask-WTF: Formularios y CSRF protection
  • Flask-CORS: Soporte para CORS en APIs
  • Flask-RESTful: Construcción rápida de APIs REST

Ejemplo de aplicación completa

from flask import Flask, render_template, request, redirect, url_for, flash
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, login_user, logout_user, login_required
from datetime import datetime

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)
login_manager = LoginManager(app)
login_manager.login_view = 'login'

# Modelo de ejemplo
class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(200), nullable=False)
    content = db.Column(db.Text, nullable=False)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)

@app.route('/')
def index():
    posts = Post.query.all()
    return render_template('index.html', posts=posts)

@app.route('/post/new', methods=['GET', 'POST'])
@login_required
def new_post():
    if request.method == 'POST':
        post = Post(
            title=request.form['title'],
            content=request.form['content']
        )
        db.session.add(post)
        db.session.commit()
        flash('Post creado exitosamente')
        return redirect(url_for('index'))
    return render_template('new_post.html')

if __name__ == '__main__':
    with app.app_context():
        db.create_all()
    app.run(debug=True)

Buenas prácticas

  • Usa entornos virtuales: Siempre aísla las dependencias de tu proyecto.
  • Configuración por entornos: Separa configuraciones para desarrollo, testing y producción.
  • Usa Blueprints: Organiza tu código en módulos reutilizables.
  • Gestiona secretos: Usa variables de entorno para información sensible.
  • Valida datos: Siempre valida y sanitiza los datos de entrada.
  • Usa HTTPS: En producción, siempre usa SSL/TLS.

Despliegue en producción

Para producción, usa un servidor WSGI como Gunicorn:

# Instalar Gunicorn
pip install gunicorn

# Ejecutar
gunicorn -w 4 -b 0.0.0.0:8000 app:app

Conclusión

Flask es una excelente opción para proyectos que requieren flexibilidad y simplicidad. Es perfecto para APIs, aplicaciones pequeñas a medianas, y cuando necesitas control total sobre la estructura de tu aplicación. Si buscas algo más estructurado y con más funcionalidades incluidas, considera Django.

Compartir

Sobre el autor

Alejandro

Desarrollador

Desarrollador web especializado en Django y Python, con pasión por la tecnología y la innovación.