首頁 > 後端開發 > Python教學 > 使用 Celery 和 Docker 在 Django 中執行 Cron 作業

使用 Celery 和 Docker 在 Django 中執行 Cron 作業

WBOY
發布: 2024-08-31 06:01:37
原創
443 人瀏覽過

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 Framework:
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 配置

  • 為 Django 的 api 建立一個 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"]
登入後複製
  • 為 celery 建立一個 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中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板