”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 使用 Celery 和 Docker 在 Django 中运行 Cron 作业

使用 Celery 和 Docker 在 Django 中运行 Cron 作业

发布于2024-09-01
浏览:534

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=

构建并运行 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如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
    我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
    将我的加密库从mcrypt升级到openssl 问题:是否可以将我的加密库从McRypt升级到OpenSSL?如果是这样,如何?答案:是的,可以将您的Encryption库从McRypt升级到OpenSSL。可以使用openssl。附加说明: [openssl_decrypt()函数要求iv参...
    编程 发布于2025-03-13
  • 大批
    大批
    [2 数组是对象,因此它们在JS中也具有方法。 切片(开始):在新数组中提取部分数组,而无需突变原始数组。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    编程 发布于2025-03-13
  • 如何使用Java.net.urlConnection和Multipart/form-data编码使用其他参数上传文件?
    如何使用Java.net.urlConnection和Multipart/form-data编码使用其他参数上传文件?
    使用http request 上传文件上传到http server,同时也提交其他参数,java.net.net.urlconnection and Multipart/form-data Encoding是普遍的。 Here's a breakdown of the process:Mu...
    编程 发布于2025-03-13
  • 数据库设计中是否应使用邮箱地址作为主键?
    数据库设计中是否应使用邮箱地址作为主键?
    是次级优势主键选择? ,您可能会遇到一个用户表的主要密钥的难题。由于其独特性,通常会考虑此角色的电子邮件地址。然而,人们对它们相对于自动收入数字的适用性产生了担忧。比较速度您的同事的主张,即弦乐比较比Integer比较慢。如果您打算用多个加入执行复杂的查询,这一点尤其重要。字符串比较在计算上比整数...
    编程 发布于2025-03-13
  • 如何使用替换指令在GO MOD中解析模块路径差异?
    如何使用替换指令在GO MOD中解析模块路径差异?
    在使用GO MOD时,在GO MOD 中克服模块路径差异时,可能会遇到冲突,其中3个Party Package将另一个PAXPANCE带有导入式套件之间的另一个软件包,并在导入式套件之间导入另一个软件包。如回声消息所证明的那样: go.etcd.io/bbolt [&&&&&&&&&&&&&&&&...
    编程 发布于2025-03-13
  • 如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    从python import codecs import codecs import codecs 导入 text = codecs.decode('这狗\ u0001f602'.encode('utf-8'),'utf-8') 印刷(文字)#带有...
    编程 发布于2025-03-13
  • Java是否允许多种返回类型:仔细研究通用方法?
    Java是否允许多种返回类型:仔细研究通用方法?
    在Java中的多个返回类型:一种误解类型:在Java编程中揭示,在Java编程中,Peculiar方法签名可能会出现,可能会出现,使开发人员陷入困境,使开发人员陷入困境。 getResult(string s); ,其中foo是自定义类。该方法声明似乎拥有两种返回类型:列表和E。但这确实是如此吗...
    编程 发布于2025-03-13
  • HTML格式标签
    HTML格式标签
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    编程 发布于2025-03-13
  • 为什么使用Firefox后退按钮时JavaScript执行停止?
    为什么使用Firefox后退按钮时JavaScript执行停止?
    导航历史记录问题:JavaScript使用Firefox Back Back 此行为是由浏览器缓存JavaScript资源引起的。要解决此问题并确保在后续页面访问中执行脚本,Firefox用户应设置一个空功能。 警报'); }; alert('inline Alert')...
    编程 发布于2025-03-13
  • C#日期差计算:两种日期之间相差多少天?
    C#日期差计算:两种日期之间相差多少天?
    [2 计算C#中的一天差异 经常,C#开发人员需要确定分隔两个日期的天数。 这对于涉及调度,任务管理和其他各种时间相关的功能的应用程序至关重要。 解决方案: 计算C#两个日期之间几天差异的最直接方法是使用以下表达式: [2 startDate 是代表您要比较的日期的日期对象。 从 enddate...
    编程 发布于2025-03-13
  • \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    答案: 在大多数现代编译器中,while(1)和(1)和(;;)之间没有性能差异。编译器: perl: 1 输入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    编程 发布于2025-03-13
  • PHP阵列键值异常:了解07和08的好奇情况
    PHP阵列键值异常:了解07和08的好奇情况
    PHP数组键值问题,使用07&08 在给定数月的数组中,键值07和08呈现令人困惑的行为时,就会出现一个不寻常的问题。运行print_r($月份)返回意外结果:键“ 07”丢失,而键“ 08”分配给了9月的值。此问题源于PHP对领先零的解释。当一个数字带有0(例如07或08)的前缀时,PHP将...
    编程 发布于2025-03-13
  • 如何准确测试``os. exit()`在GO中维护代码覆盖范围?
    如何准确测试``os. exit()`在GO中维护代码覆盖范围?
    在使用覆盖信息中测试OS.EXIT方案(coveralls.io/goveralls) 提出了修改的测试方法。 Rather than reinvoking the binary, testing is performed by modifying the os.Exit() or log.Fa...
    编程 发布于2025-03-13
  • 了解差异:为什么“ simpledateFormat” 2012 for'y'和2011年的“ y”输出
    了解差异:为什么“ simpledateFormat” 2012 for'y'和2011年的“ y”输出
    年('y')因此,'y'和'y'根据您是否需要工作年或日历年来提供不同的信息。
    编程 发布于2025-03-13
  • Python读取CSV文件UnicodeDecodeError终极解决方法
    Python读取CSV文件UnicodeDecodeError终极解决方法
    在试图使用已内置的CSV模块读取Python中时,CSV文件中的Unicode Decode Decode Decode Decode decode Error读取,您可能会遇到错误的错误:无法解码字节 在位置2-3中:截断\ uxxxxxxxx逃脱当CSV文件包含特殊字符或Unicode的路径逃...
    编程 发布于2025-03-13

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3