若是你在使用Django框架开发web项目时,须要设置定时任务或让用户手动在页面上设置定时任务,那么这篇文章可能会帮助到你。前端
在Django中实现定时任务功能大概有如下三种方法:python
定时任务是分布式任务的一种特殊类型的任务。Django的分布式主要由Celery框架实现,这是python开发的分布式任务队列。因为它自己不支持消息存储服务,因此须要第三方消息服务来传递任务,通常使用Redis。mysql
优势:linux
缺点:web
配置和使用较为复杂,须要Redis数据库和多个python第三方库。sql
只须要下载一个 django-crontab 包就可使用cron表达式在Django框架中设置定时任务。本人对这种方法了解很少,不过这种方法好像不支持windows系统,功能也相对简单。数据库
配置简单、功能齐全、使用灵活、支持windows和linux,适合中小型项目。django
django-apscheduler中相关的概念和python的定时任务框架apscheduler中的概念是同样的,有感兴趣的同窗能够自行查阅。json
(本文使用 django + mysql 架构)windows
pip install django-apscheduler
复制代码
INSTALLED_APPS = [
...
'django_apscheduler',
...
]
复制代码
python manage.py migrate
复制代码
去数据库中看一看,生成了两个表格,大部分都顾名思义。
1. django_apscheduler_djangojob
用于存储任务的表格
2. django_apscheduler_djangojobexecution
用于存储任务执行状态的表格
大概有两种建立任务的方法:装饰器和add_job函数。
在任意view.py中实现代码(我习惯新开一个app专门实现定时任务):
from apscheduler.schedulers.background import BackgroundScheduler
from django_apscheduler.jobstores import DjangoJobStore, register_events, register_job
# 实例化调度器
scheduler = BackgroundScheduler()
# 调度器使用默认的DjangoJobStore()
scheduler.add_jobstore(DjangoJobStore(), 'default')
# 天天8点半执行这个任务
@register_job(scheduler, 'cron', id='test', hour=8, minute=30,args=['test'])
def test(s):
# 具体要执行的代码
pass
# 注册定时任务并开始
register_events(scheduler)
scheduler.start()
复制代码
启动服务 python manage.py runserver
这个任务就会被存储到django_apscheduler_djangojob表中,并按照设置定时的执行程序。
@register_job(scheduler, 'date', id='test', run_date='2019-07-07 22:49:00')
@register_job(scheduler, 'interval', id='test', hours=3, minutes=30)
@register_job(scheduler, 'cron', id='test', hour=8, minute=30)
还有些其余的参数感兴趣的同窗能够查看源代码来了解。
装饰器的方法适合于写代码的人本身建立任务,若是想让用户经过页面输入参数,并提交来手动建立定时任务,就须要使用add_job函数。
下面这个小例子,前端传递json数据给后端,触发test_add_task函数,来添加任务:
import json
from django.http import JsonResponse
from apscheduler.schedulers.background import BackgroundScheduler
from django_apscheduler.jobstores import DjangoJobStore, register_events, register_job
scheduler = BackgroundScheduler()
scheduler.add_jobstore(DjangoJobStore(), 'default')
# 与前端的接口
def test_add_task(request):
if request.method == 'POST':
content = json.loads(request.body.decode()) # 接收参数
try:
start_time = content['start_time'] # 用户输入的任务开始时间, '10:00:00'
start_time = start_time.split(':')
hour = int(start_time)[0]
minute = int(start_time)[1]
second = int(start_time)[2]
s = content['s'] # 接收执行任务的各类参数
# 建立任务
scheduler.add_job(test, 'cron', hour=hour, minute=minute, second=second, args=[s])
code = '200'
message = 'success'
except Exception as e:
code = '400'
message = e
back = {
'code': code,
'message': message
}
return JsonResponse(json.dumps(data, ensure_ascii=False), safe=False)
# 具体要执行的代码
def test(s):
pass
register_events(scheduler)
scheduler.start()
复制代码
这样就能够由前端用户来手动设置定时任务了。
和装饰器的参数大同小异,只是第一个参数不一样。
若是具体要执行的函数和调用它的函数在一个文件中,那么只须要传递这个函数名就能够了(如上面的例子)。
可是我习惯将具体的业务代码写到另一个文件中,view.py中只写先后端交互的接口函数,这种状况下传递的参数为一个字符串,格式为: 'package.module:some.object',即 包名.模块:函数名
django-apscheduler框架还提供了不少操做定时任务的函数。好比:
scheduler.remove_job(job_name)
scheduler.pause_job(job_name)
scheduler.resume_job(job_name)
scheduler.modify_job(job_name)
能够在页面上作一个这样的表格,再加上简单的先后端交互就可让用户自行管理定时任务:
其余的还有一些辅助功能(包括显示全部任务,显示任务的执行时间等),同窗们能够自行查看。 最后,感谢阅读。