>백엔드 개발 >파이썬 튜토리얼 >Celery와 Docker를 사용하여 Django에서 Cron 작업 실행

Celery와 Docker를 사용하여 Django에서 Cron 작업 실행

WBOY
WBOY원래의
2024-08-31 06:01:37426검색

Running a Cron Job in Django Using Celery and Docker

크론 작업 소개

크론 작업은 지정된 간격으로 자동으로 실행되는 예약된 작업입니다. 이러한 작업은 알림 이메일 보내기, 보고서 생성 또는 데이터베이스 정리와 같은 반복적인 작업을 자동화하는 데 유용합니다. Django 프로젝트에서는 Celery와 같은 도구를 사용하여 크론 작업을 설정할 수 있어 작업 예약 및 관리가 쉽고 효율적입니다.

Django 프로젝트 설정

먼저 Django 프로젝트를 생성하고 필요한 패키지를 설치한 다음 Docker를 사용하여 프로젝트를 컨테이너화해 보겠습니다.

가상 환경 생성 및 Django 및 DRF 설치

  • 터미널을 열고 프로젝트 디렉토리로 이동하세요.
  • 가상 환경 생성 및 활성화:
python -m venv myenv
source myenv/bin/activate  # On Windows, use myenv\Scripts\activate
  • Django 및 Django REST 프레임워크 설치:
pip install django djangorestframework

Django 프로젝트 및 앱 만들기

  • 새 Django 프로젝트 만들기:
django-admin startproject myproject
cd myproject
  • 새 Django 앱 만들기:
python manage.py startapp myapp
  • settings.py에 앱을 추가하세요.
# myproject/settings.py

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

Celery 및 Redis 설치

  • Celery 및 Redis 설치:
pip install celery redis
  • celery.py 파일을 생성하여 프로젝트에 Celery를 설정합니다.
# 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'
  • Django와 함께 Celery를 로드하려면 init.py를 수정하세요.
# myproject/__init__.py
from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app

__all__ = ('celery_app',)
  • settings.py에서 Celery를 구성합니다.
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

셀러리 작업 만들기

Django 앱의tasks.py에서 작업을 정의하세요.

# myapp/tasks.py
from celery import shared_task

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

Docker 구성 생성

  • API용 Django용 Dockerfile(이름: 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"]
  • 셀러리용 Dockerfile 생성(이름: 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"]
  • Requirements.txt 파일을 생성하여 종속성을 나열합니다.
Django==4.2
djangorestframework==3.14.0
celery==5.3.1
redis==5.0.0
  • 서비스 관리를 위해 docker-compose.yml 파일을 만듭니다.
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
  • .env 파일을 생성하고 Redis URL 값을 추가합니다.
REDIS_URL=<your_redis_url>

Docker 컨테이너 빌드 및 실행

  • Docker 이미지 빌드 및 실행:
docker-compose up --build

이렇게 하면 Celery 작업자 및 Celery 비트 스케줄러와 함께 Django 애플리케이션이 시작됩니다.

크론 작업 확인

이제 Celery 작업이 정의한 일정에 따라 실행되어야 합니다. 지정된 시간에 로그를 확인하여 작업이 실행되고 있는지 확인할 수 있습니다.

결론

Celery, Docker 및 Redis를 사용하여 Django에서 cron 작업을 실행하면 백그라운드 작업 관리를 위한 강력하고 확장 가능한 솔루션이 제공됩니다. Docker는 애플리케이션이 다양한 환경에서 일관되게 실행되도록 보장하여 배포를 더 쉽게 만듭니다. 위의 단계를 따르면 작업을 효율적으로 자동화하고 Django 프로젝트를 쉽게 관리할 수 있습니다.

위 내용은 Celery와 Docker를 사용하여 Django에서 Cron 작업 실행의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.