Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Menjalankan Kerja Cron dalam Django Menggunakan Saderi dan Docker

Menjalankan Kerja Cron dalam Django Menggunakan Saderi dan Docker

WBOY
WBOYasal
2024-08-31 06:01:37327semak imbas

Running a Cron Job in Django Using Celery and Docker

Pengenalan kepada Cron Jobs

Cron job ialah tugas berjadual yang berjalan secara automatik pada selang waktu tertentu. Tugasan ini berguna untuk mengautomasikan operasi berulang seperti menghantar e-mel peringatan, menjana laporan atau membersihkan pangkalan data. Dalam projek Django, tugas cron boleh disediakan menggunakan alatan seperti Celery, yang menjadikan penjadualan dan pengurusan tugasan mudah dan cekap.

Menyediakan Projek Django Anda

Mari mulakan dengan mencipta projek Django, memasang pakej yang diperlukan, dan kemudian memasukkan projek itu dengan Docker.

Cipta Persekitaran Maya dan Pasang Django dan DRF

  • Buka terminal anda dan navigasi ke direktori projek anda.
  • Buat dan aktifkan persekitaran maya:
python -m venv myenv
source myenv/bin/activate  # On Windows, use myenv\Scripts\activate
  • Pasang Rangka Kerja Django dan Django REST:
pip install django djangorestframework

Buat Projek dan Apl Django

  • Buat projek Django baharu:
django-admin startproject myproject
cd myproject
  • Buat apl Django baharu:
python manage.py startapp myapp
  • Tambahkan apl pada tetapan.py anda:
# myproject/settings.py

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

Pasang Saderi dan Redis

  • Pasang Saderi dan Redis:
pip install celery redis
  • Sediakan Saderi dalam projek anda dengan mencipta fail 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'
  • Ubah suai init.py untuk memuatkan Celery dengan Django:
# myproject/__init__.py
from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app

__all__ = ('celery_app',)
  • Konfigurasikan Saderi dalam 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

Buat Tugasan Saderi

Dalam apl Django anda, tentukan tugas dalam tasks.py:

# myapp/tasks.py
from celery import shared_task

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

Buat Konfigurasi Docker

  • Buat fail Docker untuk Django anda untuk api (bernama: 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"]
  • Buat fail Docker untuk saderi (bernama: 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"]
  • Buat fail requirements.txt untuk menyenaraikan kebergantungan anda:
Django==4.2
djangorestframework==3.14.0
celery==5.3.1
redis==5.0.0
  • Buat fail docker-compose.yml untuk mengurus perkhidmatan:
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
  • Buat fail .env dan tambahkan nilai URL Redis padanya:
REDIS_URL=<your_redis_url>

Bina dan Jalankan Bekas Docker

  • Bina dan jalankan imej Docker:
docker-compose up --build

Ini akan memulakan aplikasi Django anda, bersama-sama dengan pekerja Saderi dan penjadual rentak Saderi.

Sahkan Kerja Cron

Tugas Saderi anda kini harus dijalankan mengikut jadual yang anda tetapkan. Anda boleh menyemak log pada masa yang ditetapkan untuk mengesahkan bahawa tugasan sedang dilaksanakan.

Kesimpulan

Menjalankan kerja cron di Django menggunakan Celery, Docker dan Redis menawarkan penyelesaian yang teguh dan berskala untuk mengurus tugas latar belakang. Docker memastikan aplikasi anda berjalan secara konsisten merentasi persekitaran yang berbeza, menjadikan penggunaan lebih mudah. Dengan mengikut langkah di atas, anda boleh mengautomasikan tugas dengan cekap dan mengurus projek Django anda dengan mudah.

Atas ialah kandungan terperinci Menjalankan Kerja Cron dalam Django Menggunakan Saderi dan Docker. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn