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创建XML文档
Mar 01 Python
python实现划词翻译
Apr 23 Python
python基本语法练习实例
Sep 19 Python
python处理数据,存进hive表的方法
Jul 04 Python
Python OpenCV处理图像之图像像素点操作
Jul 10 Python
用Python读取几十万行文本数据
Dec 24 Python
python flask web服务实现更换默认端口和IP的方法
Jul 26 Python
vscode 配置 python3开发环境的方法
Sep 19 Python
python实现广度优先搜索过程解析
Oct 19 Python
python 回溯法模板详解
Feb 26 Python
Python接口测试get请求过程详解
Feb 28 Python
Python如何输出警告信息
Jul 30 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几种字符串连接的效率比较(详解)
2017/02/22 PHP
jquery scrollTop方法根据滚动像素显示隐藏顶部导航条
2013/05/27 Javascript
js中settimeout方法加参数
2014/02/28 Javascript
实现checkbox全选、反选、取消JavaScript小脚本异常
2014/04/10 Javascript
javascript数组操作方法小结和3个属性详细介绍
2014/07/05 Javascript
分享javascript实现的冒泡排序代码并优化
2016/06/05 Javascript
浅析jQuery操作select控件的取值和设值
2016/12/07 Javascript
浅谈jQuery操作类数组的工具方法
2016/12/23 Javascript
jQuery元素选择器实例代码
2017/02/06 Javascript
js中setTimeout的妙用--防止循环超时
2017/03/06 Javascript
ThinkPHP+jquery实现“加载更多”功能代码
2017/03/11 Javascript
jQuery图片瀑布流的简单实现代码
2017/03/15 Javascript
详解vue模拟加载更多功能(数据追加)
2017/06/23 Javascript
详解使用nvm安装node.js
2017/07/18 Javascript
vue中实现methods一个方法调用另外一个方法
2018/02/08 Javascript
深入理解Promise.all
2018/08/08 Javascript
解决vue.js this.$router.push无效的问题
2018/09/03 Javascript
如何利用nodejs自动定时发送邮件提醒(超实用)
2020/12/01 NodeJs
vue3.0+vue-router+element-plus初实践
2020/12/02 Vue.js
Python的Flask框架中实现登录用户的个人资料和头像的教程
2015/04/20 Python
Python编程pygal绘图实例之XY线
2017/12/09 Python
python实现简易版计算器
2020/06/22 Python
Python cookbook(字符串与文本)针对任意多的分隔符拆分字符串操作示例
2018/04/19 Python
利用Python yagmail三行代码实现发送邮件
2018/05/11 Python
django利用request id便于定位及给日志加上request_id
2018/08/26 Python
对Python 获取类的成员变量及临时变量的方法详解
2019/01/22 Python
Python多叉树的构造及取出节点数据(treelib)的方法
2019/08/09 Python
Python面向对象原理与基础语法详解
2020/01/02 Python
Python读取分割压缩TXT文本文件实例
2020/02/14 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
2020/03/30 Python
会计电算化专业自荐信
2014/03/15 职场文书
实习单位评语
2014/04/26 职场文书
2014年会策划方案
2014/05/11 职场文书
2015年度公共机构节能工作总结
2015/05/26 职场文书
少年雷锋观后感
2015/06/10 职场文书
mybatis使用oracle进行添加数据的方法
2021/04/27 Oracle