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


Posted in Python onAugust 14, 2018

继上一篇中间表的数据是动态的,图表展示的数据才比较准确。这里用到一个新的模块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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python定时检查某个进程是否已经关闭的方法
May 20 Python
python3 图片referer防盗链的实现方法
Mar 12 Python
python操作redis方法总结
Jun 06 Python
Python中时间datetime的处理与转换用法总结
Feb 18 Python
Python JSON格式数据的提取和保存的实现
Mar 22 Python
python gensim使用word2vec词向量处理中文语料的方法
Jul 05 Python
Flask配置Cors跨域的实现
Jul 12 Python
python rolling regression. 使用 Python 实现滚动回归操作
Jun 08 Python
浅谈keras中的keras.utils.to_categorical用法
Jul 02 Python
selenium自动化测试入门实战
Dec 21 Python
让文件路径提取变得更简单的Python Path库
May 27 Python
OpenCV图像变换之傅里叶变换的一些应用
Jul 26 Python
Python延时操作实现方法示例
Aug 14 #Python
详解PyCharm配置Anaconda的艰难心路历程
Aug 13 #Python
python 实现A*算法的示例代码
Aug 13 #Python
Python绘制KS曲线的实现方法
Aug 13 #Python
Python标准库shutil用法实例详解
Aug 13 #Python
详解windows python3.7安装numpy问题的解决方法
Aug 13 #Python
python之super的使用小结
Aug 13 #Python
You might like
PHP防止表单重复提交的几种常用方法汇总
2014/08/19 PHP
PHP获取Exif缩略图的方法
2015/07/13 PHP
日期函数扩展类Ver0.1.1
2006/09/07 Javascript
Prototype RegExp对象 学习
2009/07/19 Javascript
深入理解JavaScript定时机制
2010/10/29 Javascript
基于jQuery的history历史记录插件
2010/12/11 Javascript
JS简单的轮播的图片滚动实例
2013/06/17 Javascript
js控制浏览器全屏示例代码
2014/02/20 Javascript
JavaScript通过字符串调用函数的实现方法
2015/03/18 Javascript
jquery 实现输入邮箱时自动补全下拉提示功能
2015/10/04 Javascript
谈谈js中的prototype及prototype属性解释和常用方法
2015/11/25 Javascript
JavaScript程序设计之JS调试
2015/12/09 Javascript
详解NodeJS框架express的路径映射(路由)功能及控制
2017/03/24 NodeJs
nodejs+express搭建多人聊天室步骤
2018/02/12 NodeJs
vue组件实现进度条效果
2018/06/06 Javascript
微信小程序实现页面下拉刷新和上拉加载功能详解
2018/12/03 Javascript
WebGL three.js学习笔记之阴影与实现物体的动画效果
2019/04/25 Javascript
vue设置动态请求地址的例子
2019/11/01 Javascript
JS面向对象之单选框实现
2020/01/17 Javascript
[01:07:53]RNG vs VG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python进阶教程之模块(module)介绍
2014/08/30 Python
Django Admin实现上传图片校验功能
2016/03/06 Python
python数据结构之列表和元组的详解
2017/09/23 Python
PyQt5每天必学之切换按钮
2020/08/20 Python
python 爬虫 批量获取代理ip的实例代码
2018/05/22 Python
python实现通过flask和前端进行数据收发
2019/08/22 Python
PyTorch-GPU加速实例
2020/06/23 Python
车库门开启器、遥控器和零件:Chamberlain
2019/04/09 全球购物
乌克兰最大的家用电器和电子产品连锁店:Eldorado
2019/10/02 全球购物
六查六看剖析材料
2014/02/15 职场文书
干部考核工作总结2015
2015/07/24 职场文书
2016婚礼主持词开场白
2015/11/24 职场文书
红灯733-1型14管5波段半导体收音机
2021/04/22 无线电
Linux中sftp常用命令整理
2022/06/28 Servers
win10电脑老是死机怎么办?win10系统老是死机的解决方法
2022/08/05 数码科技
python manim实现排序算法动画示例
2022/08/14 Python