"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Executando um Cron Job no Django usando Celery e Docker

Executando um Cron Job no Django usando Celery e Docker

Publicado em 01/09/2024
Navegar:141

Running a Cron Job in Django Using Celery and Docker

Introdução aos Cron Jobs

Um cron job é uma tarefa agendada que é executada automaticamente em intervalos especificados. Essas tarefas são úteis para automatizar operações repetitivas, como enviar e-mails de lembrete, gerar relatórios ou limpar bancos de dados. Em um projeto Django, os cron jobs podem ser configurados usando ferramentas como o Celery, o que torna o agendamento e o gerenciamento de tarefas fáceis e eficientes.

Configurando Seu Projeto Django

Vamos começar criando um projeto Django, instalando os pacotes necessários e, em seguida, conteinerizando o projeto com Docker.

Crie um ambiente virtual e instale Django e DRF

  • Abra seu terminal e navegue até o diretório do seu projeto.
  • Crie e ative um ambiente virtual:
python -m venv myenv
source myenv/bin/activate  # On Windows, use myenv\Scripts\activate
  • Instale o Django e o Django REST Framework:
pip install django djangorestframework

Crie um projeto e aplicativo Django

  • Crie um novo projeto Django:
django-admin startproject myproject
cd myproject
  • Crie um novo aplicativo Django:
python manage.py startapp myapp
  • Adicione o aplicativo ao seu settings.py:
# myproject/settings.py

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

Instale o aipo e o Redis

  • Instale o Aipo e o Redis:
pip install celery redis
  • Configure o Celery em seu projeto criando um arquivo 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'
  • Modifique init.py para carregar o Celery com Django:
# myproject/__init__.py
from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app

__all__ = ('celery_app',)
  • Configure o Celery em 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

Crie uma tarefa de aipo

Em seu aplicativo Django, defina a tarefa em tasks.py:

# myapp/tasks.py
from celery import shared_task

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

Criar configuração do Docker

  • Crie um Dockerfile para seu Django para a API (nomeado: 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"]
  • Crie um Dockerfile para o aipo (nomeado: 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"]
  • Crie um arquivo requirements.txt para listar suas dependências:
Django==4.2
djangorestframework==3.14.0
celery==5.3.1
redis==5.0.0
  • Crie um arquivo docker-compose.yml para gerenciar serviços:
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
  • Crie um arquivo .env e adicione o valor da URL do Redis a ele:
REDIS_URL=

Construa e execute os contêineres Docker

  • Crie e execute as imagens do Docker:
docker-compose up --build

Isso iniciará seu aplicativo Django, junto com o trabalhador Celery e o agendador de batidas do Celery.

Verifique o Cron Job

Suas tarefas do Celery agora devem ser executadas de acordo com a programação que você definiu. Você pode verificar os logs no horário especificado para confirmar se a tarefa está sendo executada.

Conclusão

Executar cron jobs no Django usando Celery, Docker e Redis oferece uma solução robusta e escalável para gerenciar tarefas em segundo plano. O Docker garante que seu aplicativo seja executado de forma consistente em diferentes ambientes, facilitando a implantação. Seguindo as etapas acima, você pode automatizar tarefas com eficiência e gerenciar seu projeto Django com facilidade.

Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/engrmark/running-a-cron-job-in-django-using-celery-and-docker-238d?1 Se houver alguma violação, entre em contato com study_golang@163 .com para excluí-lo
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3