"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Ejecutar un trabajo cron en Django usando Celery y Docker

Ejecutar un trabajo cron en Django usando Celery y Docker

Publicado el 2024-09-01
Navegar:150

Running a Cron Job in Django Using Celery and Docker

Introducción a las tareas cron

Un trabajo cron es una tarea programada que se ejecuta automáticamente en intervalos específicos. Estas tareas son útiles para automatizar operaciones repetitivas como enviar correos electrónicos recordatorios, generar informes o limpiar bases de datos. En un proyecto Django, las tareas cron se pueden configurar usando herramientas como Celery, lo que hace que programar y administrar tareas sea fácil y eficiente.

Configurando tu proyecto Django

Comencemos creando un proyecto Django, instalando los paquetes necesarios y luego colocando el proyecto en contenedores con Docker.

Cree un entorno virtual e instale Django y DRF

  • Abre tu terminal y navega hasta el directorio de tu proyecto.
  • Crear y activar un entorno virtual:
python -m venv myenv
source myenv/bin/activate  # On Windows, use myenv\Scripts\activate
  • Instalar Django y Django REST Framework:
pip install django djangorestframework

Crear un proyecto y una aplicación Django

  • Crea un nuevo proyecto Django:
django-admin startproject myproject
cd myproject
  • Crea una nueva aplicación Django:
python manage.py startapp myapp
  • Agrega la aplicación a tu configuración.py:
# myproject/settings.py

INSTALLED_APPS = [
    ...
    'myapp',
    'rest_framework',
]

Instalar apio y Redis

  • Instalar Apio y Redis:
pip install celery redis
  • Configura Celery en tu proyecto creando un archivo celery.py:
# myproject/celery.py
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')

app = Celery('myproject')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

app.conf.beat_schedule = {
    'run-this-task-every-day': {
        'task': 'myapp.tasks.my_scheduled_task',
        'schedule': crontab(minute="00", hour="7"),  # Executes every day at 7 AM
    },
}

app.conf.timezone = 'UTC'
  • Modifica init.py para cargar Celery con Django:
# myproject/__init__.py
from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app

__all__ = ('celery_app',)
  • Configurar Apio en settings.py:
CELERY_BROKER_URL = os.environ.get('REDIS_URL')
CELERY_RESULT_BACKEND = os.environ.get('REDIS_URL')
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'UTC'
CELERY_BROKER_CONNECTION_RETRY_ON_STARTUP = True

Crear una tarea de apio

En tu aplicación Django, define la tarea en task.py:

# myapp/tasks.py
from celery import shared_task

@shared_task
def my_scheduled_task():
    print("This task runs every every day.")

Crear configuración de Docker

  • Cree un Dockerfile para su Django para la API (llamado: Dockerfile.myapi):
FROM python:3.8-alpine3.15

ENV PYTHONUNBUFFERED=1
ENV PYTHONDONTWRITEBYTECODE=1

WORKDIR /app

COPY requirements.txt /app

RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 9000

CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:8000", "myproject.wsgi:application"]
  • Cree un Dockerfile para el apio (llamado: Dockerfile.myjob)
FROM python:3.8-alpine3.15

ENV PYTHONUNBUFFERED=1
ENV PYTHONDONTWRITEBYTECODE=1

WORKDIR /app
COPY requirements.txt /app
RUN pip install --no-cache-dir -r requirements.txt
COPY . /app

CMD ["celery", "-A", "myproject", "worker", "--loglevel=info", "--concurrency=4", "-E", "-B"]
  • Cree un archivo de requisitos.txt para enumerar sus dependencias:
Django==4.2
djangorestframework==3.14.0
celery==5.3.1
redis==5.0.0
  • Cree un archivo docker-compose.yml para administrar servicios:
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile.myapi
    container_name: myapp_api
    ports:
      - 7000:7000
    env_file:
      - .env

  celery:
    build:
      context: .
      dockerfile: Dockerfile.myjob
    container_name: myapp_job
    depends_on:
      - app
    env_file:
      - .env
  • Cree un archivo .env y agréguele el valor de la URL de Redis:
REDIS_URL=

Construya y ejecute los contenedores Docker

  • Compile y ejecute las imágenes de Docker:
docker-compose up --build

Esto iniciará tu aplicación Django, junto con el trabajador Celery y el programador de beats Celery.

Verificar el trabajo cron

Tus tareas de Apio ahora deberían ejecutarse según el cronograma que definiste. Puede consultar los registros a la hora especificada para confirmar que la tarea se está ejecutando.

Conclusión

La ejecución de trabajos cron en Django usando Celery, Docker y Redis ofrece una solución sólida y escalable para administrar tareas en segundo plano. Docker garantiza que su aplicación se ejecute de manera consistente en diferentes entornos, lo que facilita la implementación. Si sigue los pasos anteriores, podrá automatizar tareas de manera eficiente y administrar su proyecto Django con facilidad.

Declaración de liberación Este artículo se reproduce en: https://dev.to/engrmark/running-a-cron-job-in-django-using-celery-and-docker-238d?1 Si hay alguna infracción, comuníquese con Study_golang@163 .com para eliminarlo
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3