「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Celery と Docker を使用して Django で Cron ジョブを実行する

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

2024 年 9 月 1 日に公開
ブラウズ:846

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=

Dockerコンテナを構築して実行する

  • Docker イメージをビルドして実行します。
docker-compose up --build

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

Cron ジョブを検証する

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

結論

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

リリースステートメント この記事は次の場所に転載されています: https://dev.to/engrmark/running-a-cron-job-in-django-using-celery-and-docker-238d?1 侵害がある場合は、study_golang@163 までご連絡ください。 .comを削除してください
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3