Para implementar tareas asíncronas y programadas en Django, se puede utilizra Celery con Redis como intermediario de mensajes. A continuación se detallan los pasos de configuración.
Configuración del Servidor Redis
Se requiere un servidor Redis como broker. Ejemplo de instalación mediante Docker:
docker run -itd --name redis-servidor -p 6379:6379 redis:alpine redis-server --requirepass clave_segura
Este comando inicia un contenedor Redis con la contraseña especificada.
Instalación de Dependencias en Python
Instale Celery y el cliente de Redis usando pip:
pip install celery redis
Configuración de Celery en el Proyecto Django
Cree un archivo celery.py en el directorio raíz del proyecto junto a settings.py:
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mi_proyecto.settings')
celery_app = Celery('mi_proyecto')
celery_app.config_from_object('django.conf:settings', namespace='CELERY')
celery_app.autodiscover_tasks()
Agregue la siguiente configuración en settings.py:
CELERY_BROKER_URL = 'redis://:clave_segura@localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://:clave_segura@localhost:6379/0'
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TIMEZONE = 'America/Mexico_City'
CELERY_ENABLE_UTC = True
Modifique el archivo __init__.py del proyecto para importar la aplicación Celery:
from .celery import celery_app as app
__all__ = ('app',)
Deefinición de Tareas en la Aplicación
En su aplicación Django, cree un archivo tasks.py con las funciones de tarea. Ejemplo:
from celery import shared_task
from django.core.mail import send_mail
@shared_task
def enviar_correo():
# Lógica para enviar correo electrónico
print("Correo enviado de manera asíncrona.")
Ejecución de Tareas Asincrónicas
Para ejecutar una tarea asincrónicamente, llame a la función con el método delay(). Ejemplo en una vista:
from .tasks import enviar_correo
from django.http import HttpResponse
def vista_ejemplo(request):
enviar_correo.delay()
return HttpResponse("Tarea iniciada en segundo plano.")
Configuración de Tareas Periódicas
Para programar tareas recurrentes, defina beat_schedule en la configuración de Celery. Ejemplo para ejecutar diariamente a las 9 AM:
from celery.schedules import crontab
app.conf.beat_schedule = {
'enviar-correo-diario': {
'task': 'mi_app.tasks.enviar_correo',
'schedule': crontab(minute=0, hour=9),
},
}
Consulte la documentación oficial para más opciones de prorgamación.
Ejecución de los Procesos Celery
Para tareas asincrónicas solo se necesita el worker; para tareas periódicas se requiere además el beat.
Iniciar el worker:
celery -A mi_proyecto worker --loglevel=info --detach --pidfile=worker.pid --logfile=worker.log
Iniciar el beat:
celery -A mi_proyecto beat --loglevel=info --detach --pidfile=beat.pid --logfile=beat.log
Estos comandos ejecutan los procesos en segundo plano, generando archivos PID y logs.
Detener los Procesos
Para finalizar los procesos, use los archivos PID:
kill -TERM $(cat worker.pid)
kill -TERM $(cat beat.pid)
Esto envía una señal de terminación para una parada ordenada.
Recursos Adicionales
Para más detalles, consulte la documentación oficial de Celery: