ホームページ  >  記事  >  バックエンド開発  >  Celery と Docker を使用して Django で Cron ジョブを実行する

Celery と Docker を使用して Django で Cron ジョブを実行する

WBOY
WBOYオリジナル
2024-08-31 06:01:37395ブラウズ

Running a Cron Job in Django Using Celery and Docker

Cron ジョブの概要

cron ジョブは、指定された間隔で自動的に実行されるスケジュールされたタスクです。これらのタスクは、リマインダー電子メールの送信、レポートの生成、データベースのクリーンアップなどの反復的な操作を自動化するのに役立ちます。 Django プロジェクトでは、Celery などのツールを使用して cron ジョブを設定できるため、タスクのスケジュール設定と管理が簡単かつ効率的になります。

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'
  • init.py を変更して、Django で Celery をロードします。
# 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

これにより、Django アプリケーションが Celery ワーカーおよび Celery ビート スケジューラとともに起動します。

Cron ジョブを検証する

Celery タスクは、定義したスケジュールに従って実行されるはずです。指定した時刻のログを確認して、タスクが実行されていることを確認できます。

結論

Celery、Docker、Redis を使用して Django で cron ジョブを実行すると、バックグラウンド タスクを管理するための堅牢でスケーラブルなソリューションが提供されます。 Docker は、アプリケーションがさまざまな環境間で一貫して実行されることを保証し、デプロイを容易にします。上記の手順に従うことで、タスクを効率的に自動化し、Django プロジェクトを簡単に管理できます。

以上がCelery と Docker を使用して Django で Cron ジョブを実行するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。