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.
Beginnen wir mit der Erstellung eines Django-Projekts, der Installation der erforderlichen Pakete und der anschließenden Containerisierung des Projekts mit Docker.
python -m venv myenv source myenv/bin/activate # On Windows, use myenv\Scripts\activate
pip install django djangorestframework
django-admin startproject myproject cd myproject
python manage.py startapp myapp
# myproject/settings.py INSTALLED_APPS = [ ... 'myapp', 'rest_framework', ]
pip install celery redis
# 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'
# myproject/__init__.py from __future__ import absolute_import, unicode_literals from .celery import app as celery_app __all__ = ('celery_app',)
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
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.")
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"]
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"]
Django==4.2 djangorestframework==3.14.0 celery==5.3.1 redis==5.0.0
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
REDIS_URL=
docker-compose up --build
Dadurch wird Ihre Django-Anwendung zusammen mit dem Celery-Worker und dem Celery-Beat-Scheduler gestartet.
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.
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.
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