„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Ausführen eines Cron-Jobs in Django mit Celery und Docker

Ausführen eines Cron-Jobs in Django mit Celery und Docker

Veröffentlicht am 01.09.2024
Durchsuche:474

Running a Cron Job in Django Using Celery and Docker

Einführung in Cron-Jobs

Ein Cron-Job ist eine geplante Aufgabe, die automatisch in bestimmten Intervallen ausgeführt wird. Diese Aufgaben sind nützlich, um sich wiederholende Vorgänge wie das Versenden von Erinnerungs-E-Mails, das Erstellen von Berichten oder das Bereinigen von Datenbanken zu automatisieren. In einem Django-Projekt können Cron-Jobs mit Tools wie Celery eingerichtet werden, was die Planung und Verwaltung von Aufgaben einfach und effizient macht.

Einrichten Ihres Django-Projekts

Beginnen wir mit der Erstellung eines Django-Projekts, der Installation der erforderlichen Pakete und der anschließenden Containerisierung des Projekts mit Docker.

Erstellen Sie eine virtuelle Umgebung und installieren Sie Django und DRF

  • Öffnen Sie Ihr Terminal und navigieren Sie zu Ihrem Projektverzeichnis.
  • Erstellen und aktivieren Sie eine virtuelle Umgebung:
python -m venv myenv
source myenv/bin/activate  # On Windows, use myenv\Scripts\activate
  • Django und Django REST Framework installieren:
pip install django djangorestframework

Erstellen Sie ein Django-Projekt und eine Django-App

  • Erstellen Sie ein neues Django-Projekt:
django-admin startproject myproject
cd myproject
  • Erstellen Sie eine neue Django-App:
python manage.py startapp myapp
  • Fügen Sie die App zu Ihren Settings.py hinzu:
# myproject/settings.py

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

Installieren Sie Sellerie und Redis

  • Sellerie und Redis installieren:
pip install celery redis
  • Richten Sie Celery in Ihrem Projekt ein, indem Sie eine celery.py-Datei erstellen:
# 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'
  • Ändern Sie init.py, um Celery mit Django zu laden:
# myproject/__init__.py
from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app

__all__ = ('celery_app',)
  • Konfigurieren Sie Sellerie in 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

Erstellen Sie eine Sellerie-Aufgabe

Definieren Sie in Ihrer Django-App die Aufgabe in task.py:

# myapp/tasks.py
from celery import shared_task

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

Erstellen Sie eine Docker-Konfiguration

  • Erstellen Sie eine Docker-Datei für Ihr Django für die API (benannt: 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"]
  • Erstellen Sie eine Docker-Datei für den Sellerie (mit dem Namen: 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"]
  • Erstellen Sie eine Datei „requirements.txt“, um Ihre Abhängigkeiten aufzulisten:
Django==4.2
djangorestframework==3.14.0
celery==5.3.1
redis==5.0.0
  • Erstellen Sie eine docker-compose.yml-Datei, um Dienste zu verwalten:
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
  • Erstellen Sie eine .env-Datei und fügen Sie den Redis-URL-Wert hinzu:
REDIS_URL=

Erstellen Sie die Docker-Container und führen Sie sie aus

  • Erstellen Sie die Docker-Images und führen Sie sie aus:
docker-compose up --build

Dadurch wird Ihre Django-Anwendung zusammen mit dem Celery-Worker und dem Celery-Beat-Scheduler gestartet.

Überprüfen Sie den Cron-Job

Ihre Celery-Aufgaben sollten jetzt gemäß dem von Ihnen definierten Zeitplan ausgeführt werden. Sie können die Protokolle zum angegebenen Zeitpunkt überprüfen, um zu bestätigen, dass die Aufgabe ausgeführt wird.

Abschluss

Das Ausführen von Cron-Jobs in Django mit Celery, Docker und Redis bietet eine robuste und skalierbare Lösung für die Verwaltung von Hintergrundaufgaben. Docker stellt sicher, dass Ihre Anwendung in verschiedenen Umgebungen konsistent ausgeführt wird, was die Bereitstellung erleichtert. Indem Sie die oben genannten Schritte ausführen, können Sie Aufgaben effizient automatisieren und Ihr Django-Projekt problemlos verwalten.

Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/engrmark/running-a-cron-job-in-django-using-celery-and-docker-238d?1 Bei Verstößen wenden Sie sich bitte an Study_golang@163 .com, um es zu löschen
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3