Flask: Guía Completa para Empezar con Python
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 flaskEstructura 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:appConclusió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.
Sobre el autor
Alejandro
Desarrollador
Desarrollador web especializado en Django y Python, con pasión por la tecnología y la innovación.
