Heim >Backend-Entwicklung >Python-Tutorial >Ausführen eines Cron-Jobs in Django mit Celery und Docker

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

WBOY
WBOYOriginal
2024-08-31 06:01:37434Durchsuche

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
  • Installieren Sie Django und Django REST Framework:
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 Celery 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 „requirements.txt“-Datei, 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=<your_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.

Das obige ist der detaillierte Inhalt vonAusführen eines Cron-Jobs in Django mit Celery und Docker. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn