一直都在想写一个这样平台,前端比较low,所以就使用了Django 自带的后端写了一个定时任务管理平台
具体结构如下

djangotask/
├── app01
│?? ├── admin.py
│?? ├── apps.py
│?? ├── __init__.py
│?? ├── migrations
│?? │?? ├── __init__.py
│?? │?? └── __pycache__
│?? │??     └── __init__.cpython-38.pyc
│?? ├── models.py
│?? ├── __pycache__
│?? │?? ├── admin.cpython-38.pyc
│?? │?? ├── apps.cpython-38.pyc
│?? │?? ├── __init__.cpython-38.pyc
│?? │?? ├── models.cpython-38.pyc
│?? │?? ├── tasks.cpython-38.pyc
│?? │?? ├── urls.cpython-38.pyc
│?? │?? └── views.cpython-38.pyc
│?? ├── tasks.py
│?? ├── tests.py
│?? ├── urls.py
│?? └── views.py
├── django-db
├── djangotask
│?? ├── asgi.py
│?? ├── celery.py
│?? ├── __init__.py
│?? ├── __pycache__
│?? │?? ├── celery.cpython-38.pyc
│?? │?? ├── config.cpython-38.pyc
│?? │?? ├── __init__.cpython-38.pyc
│?? │?? ├── settings.cpython-38.pyc
│?? │?? ├── urls.cpython-38.pyc
│?? │?? └── wsgi.cpython-38.pyc
│?? ├── settings.py
│?? ├── urls.py
│?? └── wsgi.py
├── manage.py
├── requirements.txt
└── scripts├── __init__.py└── purgelog.sh

需要安装的模块通过pip命令行安装,没什么好介绍的
‘django_celery_beat’,
‘django_celery_results’,
celery通过心跳对我们添加的定时任务做了一个定时扫描这点很好,results保存了我们的task执行结果,如果想更炫点的话可以采用restframework框架查看我们的定时任务,这里不做介绍,前面有文章写了这些方面,需要的同学可以前去看看
我这个是一个简单的功能测试,所以自己创建了一个app01,创建命令django-admin startapp app01,settings文件完整如下:

"""
Django settings for djangotask project.Generated by 'django-admin startproject' using Django 3.2.13.For more information on this file, see
https://docs.djangoproject.com/en/3.2/topics/settings/For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.2/ref/settings/
"""from pathlib import Path# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-ro4r=2^w8d2z_w)cc9n4wthi+xuplnp2k=*ksb91^r!je0@te8'# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = TrueALLOWED_HOSTS = ['*']# Application definitionINSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','app01','django_celery_beat','django_celery_results','rest_framework',
]MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',
]ROOT_URLCONF = 'djangotask.urls'TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [],'APP_DIRS': True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',],},},
]WSGI_APPLICATION = 'djangotask.wsgi.application'# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databasesDATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'celeryapp','USER': 'dbadmin','PASSWORD': 'dbadmin','HOST': '192.168.56.104','PORT': '3306','OPTIONS': {'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",'charset': 'utf8mb4'}}
}# Password validation
# https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validatorsAUTH_PASSWORD_VALIDATORS = [{'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',},{'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',},{'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',},{'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',},
]# Internationalization
# https://docs.djangoproject.com/en/3.2/topics/i18n/LANGUAGE_CODE = 'zh-Hans'TIME_ZONE = 'Asia/Shanghai'USE_I18N = TrueUSE_L10N = TrueUSE_TZ = False# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.2/howto/static-files/STATIC_URL = '/static/'# Default primary key field type
# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-fieldDEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'# celery相关参数
#celery相关配置
#设置消息broker
CELERY_BROKER_URL = "redis://192.168.56.104:6380/10"
CELERY_TIMEZONE = TIME_ZONE
CELERY_ENABLE_UTC = False
DJANGO_CELERY_BEAT_TZ_AWARE = False
#存储任务状态及结果
# CELERY_RESULT_BACKEND = "redis://10.6.3.10:6379/2"
RESULT_BACKEND = "redis://192.168.56.104:6380/11"
# celery内容等消息的格式设置,默认json
CELERY_ACCEPT_CONTENT = ['application/json', ]
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
# 为任务设置超时时间,单位秒。超时即中止,执行下个任务。
# CELERY_TASK_TIME_LIMIT = 5
# 为存储结果设置过期日期,默认1天过期。如果beat开启,Celery每天会自动清除。
# 设为0,存储结果永不过期
# CELERY_RESULT_EXPIRES = xx
# 任务限流
CELERY_TASK_ANNOTATIONS = {'tasks.add': {'rate_limit': '10/s'}}
# Worker并发数量,一般默认CPU核数,可以不设置
CELERY_WORKER_CONCURRENCY = 20
# 每个worker执行了多少任务就会死掉,默认是无限的
CELERY_WORKER_MAX_TASKS_PER_CHILD = 200
#将任务调度器设为DatabaseScheduler
CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'

这里面包括了很多celery的重要配置信息,celery相关参数以下都是celery的相关配置信息
在djangotask包里面添加celery.py文件

from __future__ import absolute_import,unicode_literals
import  os
from .settings import INSTALLED_APPS
from celery import  Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE','djangotask.settings')
app=Celery('djangotask')
# app.config_from_object('djangotask.config')
app.config_from_object('django.conf:settings',namespace='CELERY')
app.conf.update(CELERY_RESULT_BACKEND ='django-db')
print(app.conf.get('result_backend'))
app.autodiscover_tasks(lambda :INSTALLED_APPS)

最后的lambda是一个匿名函数,直接扫描安装的app里面有没有tasks包的,这个匿名函数会被调用直接返回一个列表,为什么这个说呢,因为看源码可以了解的函数是否可以调用,如果可以调用就直接调用这个函数返回结果,的确非常秒的源码

def _autodiscover_tasks_from_names(self, packages, related_name):# packages argument can be lazyreturn self.loader.autodiscover_tasks(packages() if callable(packages) else packages, related_name,)

在app01下面创建tasks.py文件内容如下

from __future__ import absolute_import,unicode_literals
from celery import  shared_task
from subprocess import  getstatusoutput
@shared_task()
def add(x,y):print("invoke x+y")return  x+y@shared_task
def mul(x, y):print("invoke mul")print("invoke mul")return x * y@shared_task()
def customize_task(*args,**kwargs):# 获取自定义的脚本命令cmd=kwargs.get('cmd')# 开始执行无论python,shell一律采用subprocess方法(status,result)=getstatusoutput(cmd)return status,result

开启celery和celery beat命令,注意celery的broker是保存在redis中的,backend是保存在django-db(也就是ORM中)
很多人都反馈启动redis之后broker有数据但是django-db也就是我们
from django_celery_results.models import TaskResult这个models中的数据没有出现
我一开始也是这样,最后这样启动解决问题
celery beat启动命令

celery -A djangotask beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler
(python38) [root@mysql04 djangotask]# celery -A djangotask beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler
django-db
celery beat v5.2.6 (dawn-chorus) is starting.
__    -    ... __   -        _
LocalTime -> 2022-06-16 11:32:25
Configuration ->. broker -> redis://192.168.56.104:6380/10. loader -> celery.loaders.app.AppLoader. scheduler -> django_celery_beat.schedulers.DatabaseScheduler. logfile -> [stderr]@%INFO. maxinterval -> 5.00 seconds (5s)
[2022-06-16 11:32:25,591: INFO/MainProcess] beat: Starting...

celery 启动命令

celery -A djangotask worker -s django -c 10 -E  --loglevel=info

注意里面加了-s django这个命令

(python38) [root@mysql04 djangotask]# celery -A djangotask worker -s django -c 10 -E  --loglevel=info
django-db
/virtual/python38/lib/python3.8/site-packages/celery/platforms.py:840: SecurityWarning: You're running the worker with superuser privileges: this is
absolutely not recommended!Please specify a different user using the --uid option.User information: uid=0 euid=0 gid=0 egid=0warnings.warn(SecurityWarning(ROOT_DISCOURAGED.format(-------------- celery@mysql04 v5.2.6 (dawn-chorus)
--- ***** -----
-- ******* ---- Linux-3.10.0-1160.24.1.el7.x86_64-x86_64-with-glibc2.17 2022-06-16 11:33:18
- *** --- * ---
- ** ---------- [config]
- ** ---------- .> app:         djangotask:0x7f5f21c1a340
- ** ---------- .> transport:   redis://192.168.56.104:6380/10
- ** ---------- .> results:
- *** --- * --- .> concurrency: 10 (prefork)
-- ******* ---- .> task events: ON
--- ***** ----- -------------- [queues].> celery           exchange=celery(direct) key=celery[tasks]. app01.tasks.add. app01.tasks.customize_task. app01.tasks.mul[2022-06-16 11:33:18,768: INFO/MainProcess] Connected to redis://192.168.56.104:6380/10
[2022-06-16 11:33:18,770: INFO/MainProcess] mingle: searching for neighbors
[2022-06-16 11:33:19,786: INFO/MainProcess] mingle: all alone
[2022-06-16 11:33:19,793: WARNING/MainProcess] /virtual/python38/lib/python3.8/site-packages/celery/fixups/django.py:203: UserWarning: Using settings.DEBUG leads to a memoryleak, never use this setting in production environments!warnings.warn('''Using settings.DEBUG leads to a memory[2022-06-16 11:33:19,793: INFO/MainProcess] celery@mysql04 ready.

上面的app01/tasks.py文件中有个代码

@shared_task()
def customize_task(*args,**kwargs):# 获取自定义的脚本命令cmd=kwargs.get('cmd')# 开始执行无论python,shell一律采用subprocess方法(status,result)=getstatusoutput(cmd)return status,result

这个主要是为了定制我们要执行的脚本,服务器可以直接调用我们脚本来个性化定制任务,下面我将在django admin中演示

这个界面大家都很熟悉,django自带后台管理页面,可以设置interval,Crontabs,clocked三个时间参数选项,我们设置一个任务基于crontab

然后设置任务内容在这个时间触发

点开这个定时任务,可以传递参数

是不非常秒,可以自己想怎么定义就怎么定义



purgelog.sh脚本内容如下:

#!/bin/bash
ssh 192.168.56.104 ifconfig;
sleep 11;
echo "我爱北京天安门"

已经达到了我们的预期在指定的时间执行了,实现了我们想要的结果,当然也可以在网页前端请求中添加任务,这样前端可以很快返回结果,比较繁重的内容交给后端处理,例如发送email,或者数据库备份的事情后台搞
写的views文件体现这个内容

from app01 import  tasks
from django.http import JsonResponse
from django_celery_results.models import TaskResultdef index(request,*args,**kwargs):res=tasks.add.delay(*(1,3))return JsonResponse({'status': 'successful', 'task_id': res.task_id})

前端返回jsonResponse函数,后端处理tasks.add命令,到这这个项目结束
资源下载地址源代码完整django定时任务系统

django admin celery beat简单的定时任务管理平台相关推荐

  1. springboot 集成xxl-job 定时任务管理平台

    项目集成xxl-job https://github.com/nlxs0511/springmybatisplus.git 项目集成邮件      https://github.com/nlxs051 ...

  2. Crony分布式定时任务管理平台

    1. 基本介绍 Crony是一个基于etcd和mysql开发的分布式定时任务集中调度和管理平台,支持多节点部署,支持节点任务自动分配和故障转移,支持任务执行失败告警,部署简单,使用方便. 2.功能特性 ...

  3. 搭建golang webcron 定时任务管理平台

    获取源码 $ go get github.com/lisijie/webcron 打开配置文件 conf/app.conf,修改相关配置. 创建数据库webcron,再导入install.sql $ ...

  4. Django配置celery执行异步任务和定时任务

    原生celery,非djcelery模块,所有演示均基于Django2.0 celery是一个基于python开发的简单.灵活且可靠的分布式任务队列框架,支持使用任务队列的方式在分布式的机器/进程/线 ...

  5. 前方高能!硬核源码剖析 Celery Beat 调度原理

    Celery 是一个简单.灵活且可靠的,处理大量消息的分布式系统,它是一个专注于实时处理的任务队列,同时也支持任务调度. 为了讲解 Celery Beat 的周期调度机制及实现原理,我们会基于Djan ...

  6. Django(Celery+日志)

    celery文档参考:http://docs.jinkan.org/docs/celery/ 同步请求:所有逻辑处理.数据计算任务在View中处理完毕后返回response.在View处理任务时用户处 ...

  7. 61 Celery Beat 任务调度

    前面的任务调用都是手动触发的,本届将展示以下使用Celery的Beat进程自动调度任务. Celery Beat是Celery的调度器,其定期启动任务,然后由集群中的可用工作节点worker执行这些任 ...

  8. Celery的简单使用

    文章目录 celery简单使用 Celery执行异步任务 多任务结构 Celery执行定时任务 类似于contab的定时任务 Django中使用Celery celery简单使用 安装celery p ...

  9. celery定时任务简单使用

    celery介绍 Celery 是一个强大的分布式任务队列,它可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行.我们通常使用它来实现异步任务( async task )和定时任务( cr ...

最新文章

  1. matlab单机无限大系统_基于MATLAB的单机无穷大系统短路故障分析_吕鹏
  2. PHP mkdir()无写权限的问题解决方法
  3. 成功解决AttributeError: module 'numpy' has no attribute 'equal'
  4. Gloomy对Windows内核的分析
  5. android mdpi对应哪一个屏幕,android 常见分辨率(mdpi、hdpi 、xhdpi、xxhdpi )及屏幕适配...
  6. Linux进程终止命令kill或killall​笔记
  7. 37职责链模式(Chain of Responsibility Pattern)
  8. 计数排序和桶排序 java代码实现
  9. Investigating Div-Sum Property【数位DP】
  10. 【Angular专题】 (3)装饰器decorator,一块语法糖
  11. android ndk问题,Android ndk helloWord 问题集锦
  12. 基于SSM+SpringBoot+Thymeleaf+LayUI的高校大学生成绩分析管理系统(附论文)
  13. gc方法写法_国际上电话的正确写法和拨打方法
  14. 计算机桌面的图片要点开才可以看,在桌面上的图片文件都不显示具体图片了 只能打开这个图片才能看到是哪张图片 请问怎么处理?...
  15. 利用全加器实现7段数码管_LED数码管结构原理_LED数码管驱动方式
  16. Laravel Excel导出xls乱码
  17. 05——去哪儿(旅游网站首页开发)
  18. nginx配置不生效
  19. 谭浩强C++ 第十章
  20. android 安装多个app下载,多点下载2021安卓最新版_手机app官方版免费安装下载_豌豆荚...

热门文章

  1. AI会取代人类劳动吗?
  2. 王道考研数据结构代码总结
  3. python打印转义双引号和单引号
  4. 学习C++,做动态曲线,可以左右移动
  5. 2020今日头条面试真题及答案整理最新最全持续更新中~~~~
  6. 小伙儿年仅30就已经开始秃头?京喜店群到底做了什么?
  7. No.3 课程综述 | Flink 知其然,知其所以然
  8. linux wget返回值_Linux中curl命令和wget命令的使用介绍与比较
  9. python爬虫利用Scrapy框架爬取汽车之家奔驰图片--实战
  10. Subscriber class XXX and its super classes have no public methods with the @Subscribe annotation