django+xadmin+djcelery实现后台管理定时任务
作者:落叶虽美只活一世 发布时间:2023-12-15 03:05:52
标签:django,djcelery,定时
继上一篇中间表的数据是动态的,图表展示的数据才比较准确。这里用到一个新的模块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修改如下:
# __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
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.最终效果如下图:
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


猜你喜欢
- urllib中的异常处理在我们写爬虫程序时,若出现url中的错误,那么我们就无法爬取我们想要的内容,对此,我们引入了urllib中的异常处理
- 前言没有特别幸运,那么请先特别努力,别因为懒惰而失败,还矫情地将原因归于自己倒霉。你必须特别努力,才能显得毫不费力。希望:所以说,树倒了,没
- 元组的结构在这一小节当中主要介绍在 python 当中元组的数据结构:typedef struct { PyObj
- <html><head><title>遍历表格</title><script lang
- async / await是ES7的重要特性之一,也是目前社区里公认的优秀异步解决方案。目前,async / await这个特性已经是sta
- 参考官方案例:https://docs.python.org/zh-cn/3.8/howto/logging-cookbook.htmlim
- 第一步把tensorflow保存的.ckpt模型转为pb模型, 并记下模型的输入输出名字.第二步去ncnn的github上把仓库clone下
- 本文实例讲述了django框架事务处理。分享给大家供大家参考,具体如下:django 中要求事务处理的情况有两种:1.基于django or
- 在数据生产应用部门,取数分析是一个很常见的需求,实际上业务人员需求时刻变化,最高效的方式是让业务部门自己来取,减少不必要的重复劳动,一般情况
- 程序还不是很精简,以后再修改,程序所用的数据库为-- “冯志宏”-- 所写的--“追捕”--软件中所带IP数据库和“国华软件 Guohua
- 前言:现在写爬虫,入门已经不是一件门槛很高的事情了,网上教程一大把,但很多爬虫新手在爬取数据的过程中依旧会遇到这样那样的问题。今天整理了部分
- 前言:泛型是静态类型语言的基本特征,允许将类型作为参数传递给另一个类型、函数、或者其他结构。TypeScript 支持泛型作为将类型安全引入
- 多进程共享变量和获得结果由于工程需求,要使用多线程来跑一个程序。但是因为听说python的多线程是假的,于是使用多进程,反正任务需要共享的参
- #!/usr/bin/python #-*-coding:utf-8-*-from PyQt4.QtGu
- python可以装在任意的系统盘中,没有强制要求,默认路径是装在C盘。为什么软件默认安装位置是在C盘?下面我们来说一说。首先,需要明确一点,
- Pytorch的数据类型为各式各样的Tensor,Tensor可以理解为高维矩阵。与Numpy中的Array类似。Pytorch中的tens
- 注:此处“重复”非完全重复,意为某字段数据重复HZT表结构IDintTitlenvarchar(50)AddDatedatetime数据一.
- 内容概要:print() 是一个常用函数。那么,您是否注意过,print() 会在显示当前语句后换行。如果遇到需要连续显示、不换行的情况,比
- 为你的网站,博客等添加rss聚合功能,给出rss.asp和rss.xml两种的聚合代码看过的朋友可帮忙顶哦,这些代码都是第一次发的,外面很多
- 已解决selenium模块利用performance获取network日志请求,抛出异常selenium.common.exceptions