django+xadmin+djcelery实现后台管理定时任务

作者:落叶虽美只活一世 时间:2023-12-15 03:05:52 

继上一篇中间表的数据是动态的,图表展示的数据才比较准确。这里用到一个新的模块Djcelery,安装配置步骤如下:

1.安装

redis==2.10.6

celery==3.1.23

django-celery==3.1.17

flower==0.9.2

supervisor==3.3.4

flower用于监控定时任务,supervisor管理进程,可选

2.配置

settings.py中添加以下几行:


#最顶头加上
from __future__ import absolute_import

# celery settings
import djcelery
djcelery.setup_loader()
BROKER_URL = 'redis://localhost:6379'
# BROKER_URL = 'redis://:密码@主机地址:端口号/数据库号'
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler' # 定时任务
CELERY_RESULT_BACKEND = 'djcelery.backends.database:DatabaseBackend'
CELERY_RESULT_BACKEND = 'redis://localhost:6379'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERYD_MAX_TASKS_PER_CHILD = 40
CELERY_TIMEZONE = 'Asia/Shanghai'

INSTALLED_APPS = [
'djcelery',# 添加djcelery
]

3.注册定时任务的几个表


from __future__ import absolute_import, unicode_literals
from djcelery.models import (
 TaskState, WorkerState,
 PeriodicTask, IntervalSchedule, CrontabSchedule,
)
from xadmin.sites import site
site.register(IntervalSchedule) # 存储循环任务设置的时间
site.register(CrontabSchedule) # 存储定时任务设置的时间
site.register(PeriodicTask) # 存储任务
site.register(TaskState) # 存储任务执行状态
site.register(WorkerState) # 存储执行任务的worker

4.主应用下添加celery.py

__init__.py修改如下:

django+xadmin+djcelery实现后台管理定时任务


# __init__.py
from __future__ import absolute_import
from .celery import app as celery_app

# celery.py
from __future__ import absolute_import

import os
from celery import Celery, platforms
from django.conf import settings

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hermes.settings')

# hermes主应用名
app = Celery('hermes')
platforms.C_FORCE_ROOT = True

app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

@app.task(bind=True)
def debug_task(self):
 print('Request: {0!r}'.format(self.request))

5.添加任务 应用下添加tasks.py

django+xadmin+djcelery实现后台管理定时任务


from __future__ import absolute_import

from celery import task
import time

from .channels import Cache_data_to_redis

# 更新指定日期数据到sms_organizationcount
@task
def readAndWrite(begin,end):
 begin = str(begin)[:4] + '-' + str(begin)[4:6] + '-' + str(begin)[6:8]
 end = str(end)[:4] + '-' + str(end)[4:6] + '-' + str(end)[6:8]
 i = 0
 begin_time = time.time()
 read = Cache_data_to_redis().connection
 Rcursor = read.cursor()
 query = "SELECT id from sms_organizationcount WHERE alia_date_time between '"
 query += begin
 query += "' and '"
 query += end
 query += "'"
 readSql = "SELECT alia_month_time, alia_date_time, count(*) as total_nums, count(t.`status`=2 or null) as error_nums, name FROM \
      (select *, DATE_FORMAT(req_time,'%Y-%m') as alia_month_time, DATE_FORMAT(req_time,'%Y-%m-%d') as alia_date_time, \
      LEFT(body,LOCATE('】',body)) as name from sms_smslog where LOCATE('】',body) >0 \
      and LEFT(body,1)='【' and DATE_FORMAT(req_time,'%Y-%m-%d') between '"
 readSql += begin
 readSql += "' and '"
 readSql += end
 readSql += "')"
 readSql += " as t GROUP BY alia_date_time , name;"
 Rcursor.execute(readSql)
 readResult = Rcursor.fetchall()
 Rcursor.execute(query)
 query_result = Rcursor.fetchall()
 deleteSql = "delete from sms_organizationcount where alia_date_time between '%s' and '%s'" % (begin,end)
 if query_result:
   delete_record = Cache_data_to_redis().connection
   Dcursor = delete_record.cursor()
   Dcursor.execute(deleteSql)
   delete_record.commit()
   delete_record.close()
   for value in readResult:
   write = Cache_data_to_redis().connection
   Wcursor = write.cursor()
   writeSql = "INSERT into sms_organizationcount (alia_month_time, alia_date_time, total_nums, error_nums, `name`) " \
         " VALUES ('%s', '%s', '%s', '%s', '%s' )" %\
         (value['alia_month_time'], value['alia_date_time'], value['total_nums'], value['error_nums'], value['name'])
   try:
     Wcursor.execute(writeSql)
     i += 1
     write.commit()
   except:
     write.rollback()
   write.close()
 read.close()
 end_time = time.time()
 pass_time = end_time - begin_time
 return i, pass_time

6.最终效果如下图:

django+xadmin+djcelery实现后台管理定时任务

django+xadmin+djcelery实现后台管理定时任务

django+xadmin+djcelery实现后台管理定时任务

7.终端启动celery命令:


# 查看注册的task
celery -A hermes inspect registered
# 启动
python manage.py celery -A django_celery_demo worker -B  # django_celery_demo为celery和setting所在文件夹名

#celery_beat起不来
# 动态的输出启动进程时的输出
supervisorctl tail programname stdout

# flower监控celery
python manage.py celery flower
ip:5555

来源:https://www.cnblogs.com/NolaLi/p/9469994.html

标签:django,djcelery,定时
0
投稿

猜你喜欢

  • 关于python并发编程中的协程

    2023-10-18 04:37:44
  • 微信小程序wxml列表渲染原理解析

    2023-07-17 14:28:08
  • Python实现的合并两个有序数组算法示例

    2021-07-11 10:44:10
  • OpenCV立体图像深度图Depth Map基础

    2021-09-23 22:12:59
  • 详解ABP框架中的数据过滤器与数据传输对象的使用

    2024-05-02 17:19:47
  • Mysql升级到5.7后遇到的group by查询问题解决

    2024-01-16 12:17:50
  • SQL子查询全接触

    2007-08-20 10:51:00
  • 垂直栅格与渐进式行距(上)

    2009-04-01 18:30:00
  • 详解python中@的用法

    2022-05-15 04:52:32
  • vue引入jq插件的实例讲解

    2024-04-30 10:23:11
  • 使用PYTHON解析Wireshark的PCAP文件方法

    2022-12-26 06:04:00
  • 利用JSP的思想来做ASP

    2005-09-09 10:10:00
  • python算法表示概念扫盲教程

    2022-06-22 00:43:34
  • Python实现计算AUC的三种方式总结

    2021-07-10 23:35:32
  • 利用Python/R语言分别解决金字塔数求和问题

    2021-09-06 06:29:14
  • 在python中使用xlrd获取合并单元格的方法

    2023-09-09 17:00:43
  • PHP count()函数讲解

    2023-06-04 11:46:41
  • Python发送邮件实现基础解析

    2022-01-28 10:33:22
  • C#处理MySql多个返回集的方法

    2024-01-21 15:30:08
  • Python通过psd-tools解析PSD文件

    2023-05-25 12:08:47
  • asp之家 网络编程 m.aspxhome.com