如何使用Celery和Docker处理Django中的定期任务_docker

来源:脚本之家  责任编辑:小易  

西芹籽 对高血压有特效。有降血压、降血脂的作用。西芹籽对风温症、风湿关节炎、痛风、高尿酸症等都有舒解作用。风湿性关节炎与“感染”有关,是一种因为感染而侵袭关节组织的炎症,进而引发疼痛。这种关节炎与骨质疏松引起的关节老化病变和疼痛病理并不相同。因此,西芹籽独有的“抗炎”效果,可以对风湿性关节炎起到很好的预防和辅助治疗作用。而对于因为骨质疏松引发的其他关节问题,西芹籽的作用可能就e799bee5baa6e59b9ee7ad9431333363376461不大了。Blackmores Celery3000西芹籽精华的主要成分包括:西芹籽精华:3000mg,西芹籽油:2mg。它适宜的人群包括:1.关节红、肿、热痛、反复发作,发病典型部位为拇指、大脚趾关节(包括膝、腕、肘和掌指关节等部位)。2.饮酒,伤口感染,创伤和手术诱发的痛风病症。3.平时怕冷饮、容易疲劳、关节活动不灵活、行走不便。4.家族中有痛风病史、血尿酸含量明显高于正常水平。5.有原因不明的泌尿系统结石,尤其是多发性肾结石或双侧肾结石。澳洲Blackmores西芹籽精华-【注意事项】1、成人:每日一至两片,随餐服用;2、12岁以下慎用;3、避免晚间服用,由于小便对睡眠的影响;4、不推荐在妊娠或哺乳期间使用,如果症状持续,请看医生。我给我妈妈买过,是在一个网站上面,叫嘉利城的,你可以上那上面买www.zgxue.com防采集请勿采集本网。

在构建和扩展Django应用程序时,不可避免地需要定期在后台自动运行某些任务。

1) 安装 需要安装RabbitMQ、Celery和Django-celery Celery和Django-celery的安装直接pip就好 2) 修改settings.py 在INSTALLED_APPS中加入app: INSTALLED_APPS= 'djcelery', 'main',#startapp }

一些例子:

node-celery for Node,还有node.js实现的node-celery和一个php实现的客户端,这为高可用性和横向扩展提供了便利。Celery是用python语言实现的,但是可以使用任何语言实现其协议。除了python以外。Celery

生成定期报告

肯定 Yes,she does. 否定 No,she doesn't. 真心祝你学习进步,如果你对这个答案有什么疑问,请追问, 另外如果你觉得我的回答对你有所帮助,请千万别忘记采纳哟!

清除缓存

优先级 实时:占用全部可用资源,可用资源不足时,优先使用高、较高(高于标准,后同)、一般、较低、自由等级的程序占用的资源 高:占用可用资源,可用资源不足时,占用较高一般较低自由的资源,且会让步

发送批量电子邮件通知

测试 rabbitmq 的性能方法如下:1、声明7个具有不同属性的queue,分别和名为test_exchage的exchange进行绑定(因为exchange为fanout类型,所以测试代码中的routing_key其实是不起作用的);2、向

执行每晚维护工作

这是构建和扩展不属于Django核心的Web应用程序所需的少数功能之一。幸运的是,Celery提供了一个强大的解决方案,该解决方案非常容易实现,称为Celery Beat。

在下面的文章中,我们将向您展示如何使用Docker设置Django,Celery和Redis,以便通过Celery Beat定期运行自定义Django Admin命令。

依存关系:

Django v3.0.5

Docker v19.03.8

Python v3.8.2

芹菜v4.4.1

Redis v5.0.8

Django + Celery系列:

Django和Celery的异步任务

使用Celery和Docker处理Django中的定期任务(本文!)

目标

在本教程结束时,您应该能够:

使用Docker容器化Django,Celery和Redis

将Celery集成到Django应用中并创建任务

编写自定义Django Admin命令

安排自定义Django Admin命令以通过Celery Beat定期运行

项目设置

django-celery-beat存储库中克隆基础项目,然后签出基础分支:

$ git clone

https://github.com/testdrivenio/django-celery-beat

--branch base --single-branch

$ cd django-celery-beat

由于我们总共需要管理四个流程(Django,Redis,worker和Scheduler),因此我们将使用Docker通过连接起来简化它们的工作流程,从而使它们都可以通过一个命令从一个终端窗口运行 。

从项目根目录创建映像,并启动Docker容器:

$ docker-compose up -d --build$ docker-compose exec web python manage.py migrate

构建完成后,导航至http:// localhost:1337以确保该应用程序能够按预期运行。 您应该看到以下文本:

Orders

 No orders found!

项目结构:

├── .gitignore

├── docker-compose.yml

└── project

    ├── Dockerfile

    ├── core

    │   ├── __init__.py

    │   ├── asgi.py

    │   ├── settings.py

    │   ├── urls.py

    │   └── wsgi.py

    ├── entrypoint.sh

    ├── manage.py

    ├── orders

    │   ├── __init__.py

    │   ├── admin.py

    │   ├── apps.py

    │   ├── migrations

    │   │   ├── 0001_initial.py

    │   │   └── __init__.py

    │   ├── models.py

    │   ├── tests.py

    │   ├── urls.py

    │   └── views.py

    ├── requirements.txt

    └── templates

        └── orders

            └── order_list.html

Celery和Redis

现在,我们需要为Celery,Celery Beat和Redis添加容器。

首先,将依赖项添加到requirements.txt文件中:

Django==3.0.5celery==4.4.1redis==3.4.1

docker-compose.yml文件内容:

redis: image: redis:alpinecelery: build: ./project command: celery -A core worker -l info volumes: - ./project/:/usr/src/app/ environment: - DEBUG=1 - SECRET_KEY=dbaa1_i7%*3r9-=z-+_mz4r-!qeed@(-a_r(g@k8jo8y3r27%m - DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1 [::1] depends_on: - rediscelery-beat: build: ./project command: celery -A core beat -l info volumes: - ./project/:/usr/src/app/ environment: - DEBUG=1 - SECRET_KEY=dbaa1_i7%*3r9-=z-+_mz4r-!qeed@(-a_r(g@k8jo8y3r27%m - DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1 [::1] depends_on: - redis

我们还需要更新Web服务的depends_on部分:

web: build: ./project command: python manage.py runserver 0.0.0.0:8000 volumes: - ./project/:/usr/src/app/ ports: - 1337:8000 environment: - DEBUG=1 - SECRET_KEY=dbaa1_i7%*3r9-=z-+_mz4r-!qeed@(-a_r(g@k8jo8y3r27%m - DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1 [::1] depends_on: - redis # NEW

完整的docker-compose文件如下:

version: '3.7' services: web: build: ./project command: python manage.py runserver 0.0.0.0:8000 volumes: - ./project/:/usr/src/app/ ports: - 1337:8000 environment: - DEBUG=1 - SECRET_KEY=dbaa1_i7%*3r9-=z-+_mz4r-!qeed@(-a_r(g@k8jo8y3r27%m - DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1 [::1] depends_on: - redis redis: image: redis:alpine celery: build: ./project command: celery -A core worker -l info volumes: - ./project/:/usr/src/app/ environment: - DEBUG=1 - SECRET_KEY=dbaa1_i7%*3r9-=z-+_mz4r-!qeed@(-a_r(g@k8jo8y3r27%m - DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1 [::1] depends_on: - redis celery-beat: build: ./project command: celery -A core beat -l info volumes: - ./project/:/usr/src/app/ environment: - DEBUG=1 - SECRET_KEY=dbaa1_i7%*3r9-=z-+_mz4r-!qeed@(-a_r(g@k8jo8y3r27%m - DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1 [::1] depends_on: - redis

在构建新容器之前,我们需要在Django应用中配置Celery。

芹菜配置

设定

在“核心”目录中,创建一个celery.py文件并添加以下代码:

import osfrom celery import Celeryos.environ.setdefault("DJANGO_SETTINGS_MODULE", "core.settings") app = Celery("core")app.config_from_object("django.conf:settings", namespace="CELERY")app.autodiscover_tasks()

这里发生了什么事?

首先,我们为DJANGO_SETTINGS_MODULE环境变量设置一个默认值,以便Celery知道如何找到Django项目。

接下来,我们创建了一个名称为core的新Celery实例,并将该值分配给名为app的变量。

然后,我们从django.conf的settings对象中加载了celery配置值。 我们使用namespace =“ CELERY”来防止与其他Django设置发生冲突。 换句话说,Celery的所有配置设置必须以CELERY_为前缀。

最后,app.autodiscover_tasks()告诉Celery从settings.INSTALLED_APPS中定义的应用程序中查找Celery任务。

将以下代码添加到core / __ init__.py:

from .celery import app as celery_app __all__ = ("celery_app",)

最后,使用以下Celery设置更新core / settings.py文件,使其可以连接到Redis:

CELERY_BROKER_URL = "redis://redis:6379"CELERY_RESULT_BACKEND = "redis://redis:6379"

build:

$ docker-compose up -d --build

查看日志:

$ docker-compose logs 'web'$ docker-compose logs 'celery'$ docker-compose logs 'celery-beat'$ docker-compose logs 'redis'

如果一切顺利,我们现在有四个容器,每个容器提供不同的服务。

现在,我们准备创建一个示例任务,以查看其是否可以正常工作。

创建一个任务

创建一个新文件core / tasks.py并为仅打印到控制台的示例任务添加以下代码:

from celery import shared_task@shared_taskdef sample_task(): print("The sample task just ran.")

安排任务

在settings.py文件的末尾,添加以下代码,以使用Celery Beat将sample_task安排为每分钟运行一次:

CELERY_BEAT_SCHEDULE = { "sample_task": { "task": "core.tasks.sample_task", "schedule": crontab(minute="*/1"), },}

在这里,我们使用CELERY_BEAT_SCHEDULE设置定义了定期任务。 我们给任务命名了sample_task,然后声明了两个设置:

任务声明要运行的任务。

时间表设置任务应运行的时间间隔。 这可以是整数,时间增量或crontab。 我们在任务中使用了crontab模式,告诉它每分钟运行一次。 您可以在此处找到有关Celery日程安排的更多信息。

确保添加导入:

from celery.schedules import crontab import core.tasks

重启容器,应用变更:

$ docker-compose up -d --build

查看日志:

$ docker-compose logs -f 'celery'celery_1 | -------------- [queues]celery_1 | .> celery exchange=celery(direct) key=celerycelery_1 |celery_1 |celery_1 | [tasks]celery_1 | . core.tasks.sample_task

我们可以看到Celery获得了示例任务core.tasks.sample_task。

每分钟,您应该在日志中看到一行以“示例任务刚刚运行”结尾的行:

celery_1  | [2020-04-15 22:49:00,003: INFO/MainProcess]

              Received task: core.tasks.sample_task[8ee5a84f-c54b-4e41-945b-645765e7b20a]

celery_1  | [2020-04-15 22:49:00,007: WARNING/ForkPoolWorker-1] The sample task just ran.

自定义Django Admin命令

Django提供了许多内置的django-admin命令,例如:

迁移

启动项目

startapp

转储数据

移民

除了内置命令,Django还为我们提供了创建自己的自定义命令的选项:

自定义管理命令对于运行独立脚本或从UNIX crontab或Windows计划任务控制面板定期执行的脚本特别有用。

因此,我们将首先配置一个新命令,然后使用Celery Beat自动运行它。

首先创建一个名为orders / management / commands / my_custom_command.py的新文件。 然后,添加运行它所需的最少代码:

from django.core.management.base import BaseCommand, CommandError class Command(BaseCommand): help = "A description of the command" def handle(self, *args, **options): pass

BaseCommand有一些可以被覆盖的方法,但是唯一需要的方法是handle。 handle是自定义命令的入口点。 换句话说,当我们运行命令时,将调用此方法。

为了进行测试,我们通常只添加一个快速打印语句。 但是,建议根据Django文档使用stdout.write代替:

当您使用管理命令并希望提供控制台输出时,应该写入self.stdout和self.stderr,而不是直接打印到stdout和stderr。 通过使用这些代理,测试自定义命令变得更加容易。 另请注意,您无需以换行符结束消息,除非您指定结束参数,否则它将自动添加。

因此,添加一个self.stdout.write命令:

from django.core.management.base import BaseCommand, CommandError class Command(BaseCommand): help = "A description of the command" def handle(self, *args, **options): self.stdout.write("My sample command just ran.") # NEW

测试:

$ docker-compose exec web python manage.py my_custom_commandMy sample command just ran.

这样,让我们将所有内容捆绑在一起!

使用Celery Beat安排自定义命令

现在我们已经启动并运行了容器,已经过测试,可以安排任务定期运行,并编写了自定义的Django Admin示例命令,现在该进行设置以定期运行自定义命令了。

设定

在项目中,我们有一个非常基本的应用程序,称为订单。 它包含两个模型,产品和订单。 让我们创建一个自定义命令,该命令从当天发送确认订单的电子邮件报告。

首先,我们将通过此项目中包含的夹具将一些产品和订单添加到数据库中:

$ docker-compose exec web python manage.py loaddata products.json

创建超级用户:

$ docker-compose exec web python manage.py createsuperuser

出现提示时,请填写用户名,电子邮件和密码。 然后在您的Web浏览器中导航到http://127.0.0.1:1337/admin。 使用您刚创建的超级用户登录,并创建几个订单。 确保至少有一个日期为今天。

让我们为我们的电子邮件报告创建一个新的自定义命令。

创建一个名为orders / management / commands / email_report.py的文件:

from datetime import timedelta, time, datetime from django.core.mail import mail_adminsfrom django.core.management import BaseCommandfrom django.utils import timezonefrom django.utils.timezone import make_aware from orders.models import Order today = timezone.now()tomorrow = today + timedelta(1)today_start = make_aware(datetime.combine(today, time()))today_end = make_aware(datetime.combine(tomorrow, time())) class Command(BaseCommand): help = "Send Today's Orders Report to Admins" def handle(self, *args, **options): orders = Order.objects.filter(confirmed_date__range=(today_start, today_end)) if orders: message = "" for order in orders: message += f"{order} \n" subject = ( f"Order Report for {today_start.strftime('%Y-%m-%d')} " f"to {today_end.strftime('%Y-%m-%d')}" ) mail_admins(subject=subject, message=message, html_message=None) self.stdout.write("E-mail Report was sent.") else: self.stdout.write("No orders confirmed today.")

在代码中,我们向数据库查询了日期为Confirmed_date的订单,将订单合并为电子邮件正文的单个消息,然后使用Django内置的mail_admins命令将电子邮件发送给管理员。

添加一个虚拟管理员电子邮件,并将EMAIL_BACKEND设置为使用控制台后端,以便将该电子邮件发送到设置文件中的stdout:

EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"DEFAULT_FROM_EMAIL = "noreply@email.com"ADMINS = [("testuser", "test.user@email.com"), ]

运行:

$ docker-compose exec web python manage.py email_report

Content-Type: text/plain; charset="utf-8"

MIME-Version: 1.0

Content-Transfer-Encoding: 7bit

Subject: [Django] Order Report for 2020-04-15 to 2020-04-16

From: root@localhost

To: test.user@email.com

Date: Wed, 15 Apr 2020 23:10:45 -0000

Message-ID: <158699224565.85.8278261495663971825@5ce6313185d3>

 

Order: 337ef21c-5f53-4761-9f81-07945de385ae - product: Rice

 

-------------------------------------------------------------------------------

E-mail Report was sent.

Celery Beat

现在,我们需要创建一个定期任务来每天运行此命令。

向core / tasks.py添加一个新任务:

from celery import shared_taskfrom django.core.management import call_command # NEW @shared_taskdef sample_task(): print("The sample task just ran.") # NEW@shared_taskdef send_email_report(): call_command("email_report", )

因此,首先我们添加了一个call_command导入,该导入用于以编程方式调用django-admin命令。 在新任务中,然后将call_command与自定义命令的名称一起用作参数。

要安排此任务,请打开core / settings.py文件,并更新CELERY_BEAT_SCHEDULE设置以包括新任务。

CELERY_BEAT_SCHEDULE = { "sample_task": { "task": "core.tasks.sample_task", "schedule": crontab(minute="*/1"), }, "send_email_report": { "task": "core.tasks.send_email_report", "schedule": crontab(hour="*/1"), },}

在这里,我们向CELERY_BEAT_SCHEDULE添加了一个名为send_email_report的新条目。 正如我们对上一个任务所做的那样,我们声明了该任务应运行的任务-例如core.tasks.send_email_report-并使用crontab模式设置重复性。

重新启动容器,以确保新设置处于活动状态:

$ docker-compose up -d --build看日志:$ docker-compose logs -f 'celery'celery_1 | -------------- [queues]celery_1 | .> celery exchange=celery(direct) key=celerycelery_1 |celery_1 |celery_1 | [tasks]celery_1 | . core.tasks.sample_taskcelery_1 | . core.tasks.send_email_report

一分钟后邮件发出:

celery_1  | [2020-04-15 23:20:00,309: WARNING/ForkPoolWorker-1] Content-Type: text/plain; charset="utf-8"

celery_1  | MIME-Version: 1.0

celery_1  | Content-Transfer-Encoding: 7bit

celery_1  | Subject: [Django] Order Report for 2020-04-15 to 2020-04-16

celery_1  | From: root@localhost

celery_1  | To: test.user@email.com

celery_1  | Date: Wed, 15 Apr 2020 23:20:00 -0000

celery_1  | Message-ID: <158699280030.12.8934112422500683251@42481c198b77>

celery_1  |

celery_1  | Order: 337ef21c-5f53-4761-9f81-07945de385ae - product: Rice

celery_1  | [2020-04-15 23:20:00,310: WARNING/ForkPoolWorker-1] -------------------------------------------------------------------------------

celery_1  | [2020-04-15 23:20:00,312: WARNING/ForkPoolWorker-1] E-mail Report was sent.

结论

在本文中,我们指导您为Celery,Celery Beat和Redis设置Docker容器。 然后,我们展示了如何使用Celery Beat创建自定义Django Admin命令和定期任务以自动运行该命令。

原文:https://testdriven.io/blog/django-celery-periodic-tasks/

到此这篇关于如何使用Celery和Docker处理Django中的定期任务的文章就介绍到这了,更多相关Celery Docker 处理Django定期任务内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网!

celery 一般指平时所说的西芹,和我们在菜场看到的普通芹菜还不太一样,很粗大,可以直接作为蔬菜食用的,比如在西餐中作为烤鸡翅的配菜沾奶酪调味汁吃。parsley并不是西芹,中文译名为欧芹或是法香,作为西餐中非常常用的一种香料,中餐馆里也用它作装饰,有扁叶和卷曲叶两种,两种植物并不是同一属,相差比较多内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • django定期执行任务(实例讲解)
  • docker测试时候命令无法补全的解决方法
  • docker 实用技巧总结
  • docker容器配置nginx实例分享
  • docker mqtt安装使用教程
  • 详解docker容器运行多条命令(supervisor)
  • docker 实现浏览器里开发android应用的功能
  • 使用docker创建集成服务lnmp环境
  • 详解docker如何启动一个centos镜像
  • 记一次docker生产环境搭建的方法
  • zabbix监控docker容器状态【推荐】
  • 谁能告诉我:两个芹菜celery和 parsley的区别
  • 请问有谁知道Blackmores澳佳宝 Celery3000西芹籽精华都有哪些功效?在哪里可以买到?
  • 如何在多个queue以及多台server上部署Celery
  • python 使用celery为了解决什么业务问题
  • 如何使用django+celery+RabbitMQ实现异步执行
  • celery如何控制任务执行的次数
  • does she like celery?怎么回答
  • 如何利用 Celery 执行定时任务并设置优先级
  • Rabbitmq 和 Celery 是怎样工作的
  • 澳洲西芹籽有副作用吗
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全dockerhyper-vvmwarevirtualboxxenserverkvmqemuopenvzxencloudstackopenstack云计算技术云其它首页服务器云和虚拟化dockerdjango定期执行任务(实例讲解)docker测试时候命令无法补全的解决方法docker 实用技巧总结docker容器配置nginx实例分享docker mqtt安装使用教程详解docker容器运行多条命令(supervisor)docker 实现浏览器里开发android应用的功能使用docker创建集成服务lnmp环境详解docker如何启动一个centos镜像记一次docker生产环境搭建的方法zabbix监控docker容器状态【推荐】docker 给运行中的容器设置端口映docker 清理命令集锦docker获取镜像报错docker: erroubuntu14.04+docker的安装及使用docker.service启动失败:unit ndocker容器如何优雅的终止详解浅谈docker-compose网络设置之necentos7 安装docker 解决启动不了详解docker国内镜像拉取和镜像加docker如何固定ip设置的方法centos7 docker防火墙的简单配置教程docker构建elk docker集群日志收集系统详解docker基于已有的镜像制新的镜像详解docker数据管理(数据卷&数据卷容器)centos 7.2 下安装 docker 1.12.3 版的详滚动 docker 中的 nginx 日志思路详解docker使用过程中的一些注意事项为docker中的nginx配置https的方法步骤基于docker搭建nginx文件服务器的方法步骤详解centos7 docker1.12安装私有仓库
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved