django+xadmin+djcelery實(shí)現(xiàn)后臺(tái)管理定時(shí)任務(wù)
繼上一篇中間表的數(shù)據(jù)是動(dòng)態(tài)的,圖表展示的數(shù)據(jù)才比較準(zhǔn)確。這里用到一個(gè)新的模塊Djcelery,安裝配置步驟如下:
1.安裝
redis==2.10.6
celery==3.1.23
django-celery==3.1.17
flower==0.9.2
supervisor==3.3.4
flower用于監(jiān)控定時(shí)任務(wù),supervisor管理進(jìn)程,可選
2.配置
settings.py中添加以下幾行:
#最頂頭加上 from __future__ import absolute_import # celery settings import djcelery djcelery.setup_loader() BROKER_URL = 'redis://localhost:6379' # BROKER_URL = 'redis://:密碼@主機(jī)地址:端口號(hào)/數(shù)據(jù)庫(kù)號(hào)' CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler' # 定時(shí)任務(wù) 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.注冊(cè)定時(shí)任務(wù)的幾個(gè)表
from __future__ import absolute_import, unicode_literals from djcelery.models import ( TaskState, WorkerState, PeriodicTask, IntervalSchedule, CrontabSchedule, ) from xadmin.sites import site site.register(IntervalSchedule) # 存儲(chǔ)循環(huán)任務(wù)設(shè)置的時(shí)間 site.register(CrontabSchedule) # 存儲(chǔ)定時(shí)任務(wù)設(shè)置的時(shí)間 site.register(PeriodicTask) # 存儲(chǔ)任務(wù) site.register(TaskState) # 存儲(chǔ)任務(wù)執(zhí)行狀態(tài) site.register(WorkerState) # 存儲(chǔ)執(zhí)行任務(wù)的worker
4.主應(yīng)用下添加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主應(yīng)用名
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.添加任務(wù) 應(yīng)用下添加tasks.py

from __future__ import absolute_import
from celery import task
import time
from .channels import Cache_data_to_redis
# 更新指定日期數(shù)據(jù)到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.終端啟動(dòng)celery命令:
# 查看注冊(cè)的task celery -A hermes inspect registered # 啟動(dòng) python manage.py celery -A django_celery_demo worker -B # django_celery_demo為celery和setting所在文件夾名 #celery_beat起不來(lái) # 動(dòng)態(tài)的輸出啟動(dòng)進(jìn)程時(shí)的輸出 supervisorctl tail programname stdout # flower監(jiān)控celery python manage.py celery flower ip:5555
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
pytorch中nn.Flatten()函數(shù)詳解及示例
nn.Flatten是一個(gè)類(lèi),而torch.flatten()則是一個(gè)函數(shù),下面這篇文章主要給大家介紹了關(guān)于pytorch中nn.Flatten()函數(shù)詳解及示例的相關(guān)資料,需要的朋友可以參考下2023-01-01
Python爬蟲(chóng)之對(duì)CSDN榜單進(jìn)行分析
這篇文章主要介紹了Python爬蟲(chóng)之對(duì)CSDN榜單進(jìn)行分析,文章有詳細(xì)代碼,簡(jiǎn)單易懂,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2023-01-01
Pytorch實(shí)現(xiàn)網(wǎng)絡(luò)部分層的固定不進(jìn)行回傳更新問(wèn)題及思路詳解
這篇文章主要介紹了Pytorch實(shí)現(xiàn)網(wǎng)絡(luò)部分層的固定不進(jìn)行回傳更新,實(shí)現(xiàn)思路就是利用tensor的requires_grad,每一個(gè)tensor都有自己的requires_grad成員,值只能為T(mén)rue和False,具體內(nèi)容詳情跟隨小編一起看看吧2021-08-08
python 使用poster模塊進(jìn)行http方式的文件傳輸?shù)椒?wù)器的方法
今天小編就為大家分享一篇python 使用poster模塊進(jìn)行http方式的文件傳輸?shù)椒?wù)器的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
pygame用blit()實(shí)現(xiàn)動(dòng)畫(huà)效果的示例代碼
這篇文章主要介紹了pygame用blit()實(shí)現(xiàn)動(dòng)畫(huà)效果的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
淺談python腳本設(shè)置運(yùn)行參數(shù)的方法
今天小編就為大家分享一篇淺談python腳本設(shè)置運(yùn)行參數(shù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
解決pycharm debug時(shí)界面下方不出現(xiàn)step等按鈕及變量值的問(wèn)題
這篇文章主要介紹了解決pycharm debug時(shí)界面下方不出現(xiàn)step等按鈕及變量值的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06

