首页 >后端开发 >Python教程 >使用 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

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn