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如何使用AIML搭建聊天机器人
Jan 27 Python
python中私有函数调用方法解密
Apr 29 Python
Python利用IPython提高开发效率
Aug 10 Python
Python入门必须知道的11个知识点
Mar 21 Python
利用python库在局域网内传输文件的方法
Jun 04 Python
python处理csv中的空值方法
Jun 22 Python
解决python中遇到字典里key值为None的情况,取不出来的问题
Oct 17 Python
Django如何自定义model创建数据库索引的顺序
Jun 20 Python
详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
Aug 23 Python
python中seaborn包常用图形使用详解
Nov 25 Python
Win10下用Anaconda安装TensorFlow(图文教程)
Jun 18 Python
Python3使用tesserocr识别字母数字验证码的实现
Jan 29 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
BBS(php & mysql)完整版(八)
2006/10/09 PHP
php自定义的格式化时间示例代码
2013/12/05 PHP
PHP中浮点数计算比较及取整不准确的解决方法
2015/01/09 PHP
如何使用php脚本给html中引用的js和css路径打上版本号
2015/11/18 PHP
php调用自己java程序的方法详解
2016/05/13 PHP
PHP缩略图生成和图片水印制作
2017/01/07 PHP
php判断文件上传图片格式的实例详解
2017/09/30 PHP
PHP实现微信提现功能(微信商城)
2019/11/21 PHP
关于event.cancelBubble和event.stopPropagation()的区别介绍
2011/12/11 Javascript
常用一些Javascript判断函数
2012/08/14 Javascript
div当滚动到页面顶部的时候固定在顶部实例代码
2013/05/27 Javascript
Node.js与MySQL交互操作及其注意事项
2016/10/05 Javascript
jQuery插件zTree实现获取当前选中节点在同级节点中序号的方法
2017/03/08 Javascript
jQuery、layer实现弹出层的打开、关闭功能
2017/06/28 jQuery
解决AjaxFileupload 上传时会出现连接重置的问题
2017/07/07 Javascript
Vue单页式应用(Hash模式下)实现微信分享的实例
2017/07/21 Javascript
基于react后端渲染模板引擎noox发布使用
2018/01/11 Javascript
详解如何用VUE写一个多用模态框组件模版
2018/09/27 Javascript
基于webpack4+vue-cli3项目实现换肤功能
2019/07/17 Javascript
jquery 键盘事件 keypress() keydown() keyup()用法总结
2019/10/23 jQuery
element实现合并单元格通用方法
2019/11/13 Javascript
vue 导航菜单刷新状态不消失,显示对应的路由界面操作
2020/08/06 Javascript
Javascript var变量删除原理及实现
2020/08/26 Javascript
antd多选下拉框一行展示的实现方式
2020/10/31 Javascript
Python functools模块学习总结
2015/05/09 Python
【python】matplotlib动态显示详解
2019/04/11 Python
分享8个非常流行的 Python 可视化工具包
2019/06/05 Python
Python实现性能自动化测试竟然如此简单
2019/07/30 Python
python模拟键盘输入 切换键盘布局过程解析
2019/08/15 Python
Python 实现自动完成A4标签排版打印功能
2020/04/09 Python
土耳其国际性时尚购物网站:Modanisa
2018/01/19 全球购物
英国运动服、设备及配件网站:DW Sports
2019/12/04 全球购物
Tahari ASL官方网站:高级设计师女装
2021/03/15 全球购物
乡村教师党员四风问题对照检查材料思想汇报
2014/10/08 职场文书
自主招生英文自荐信
2015/03/25 职场文书
AJAX学习笔记
2021/05/18 Javascript