Django 前端发送定时任务时间+Apscheduler 后端接收时间 实现定时任务
首先偶作开始想要的功能是前端发送一个执行任务的时间,后端收到时间后执行。百度了一圈文章不是转载就是抄!!最开始选的是Apscheduler, 搞了1天没有实现要的功能,然后试了试celery …我只能说功能多但是复杂(还难用)需要启动很多的监听工具。
说说我的实现步骤:
1.前端.
用的bootstrap的一个插件datetimepicker
第一个为选择到一个时间后执行任务,第二个为输入多久执行一次(比如5分钟执行一次)
datetimepicker 只需要我们在header中添加:
<script src="https://cdn.bootcss.com/smalot-bootstrap-datetimepicker/2.4.4/js/bootstrap-datetimepicker.min.js"></script>
<script src="https://cdn.bootcss.com/smalot-bootstrap-datetimepicker/2.4.4/js/locales/bootstrap-datetimepicker.zh-CN.js"></script>
<link href="https://cdn.bootcss.com/smalot-bootstrap-datetimepicker/2.4.4/css/bootstrap-datetimepicker.min.css" rel="stylesheet">
我在在js中写入这些:
$('.form_date').datetimepicker({
language: 'zh-CN',
format: "yyyy-mm-dd hh:ii:ss",
statView: 2,
todayBtn: true,
autoclose: true,
todayHighlight: 1,
startDate: "2018-10-14 10:00",
endDate :"2035-01-01"
});
主要指定了这个日历中的起始时间和结束时间,以及时间格式,中文等。
然后写一个ajax请求将输入框中的参数发送到后端(Django基本的MVT使用)
后端将接收到的时间参数传递给run_date
scheduler.add_job(add_to_periodic_task,'date',run_date=localtime)
注意这里有个坑,这样的时间参数以及格式是没问题,前端传递过来的时间格式为:
2019-01-16 08:30:44
run_date接收参数后会直接报错,原因是格式不正确
解决方法有点麻烦,第一步:
引入time这个模块
第二部:
timechuo = time.mktime(time.strptime(singel_task_date,'%Y-%m-%d %H:%M:%S'))
通过这个方法将前端传递的时间格式转换为时间戳
然后
localtime = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(timechuo))
将时间戳转换为本地时间,这样定时任务就能执行了。scheduler.add_job(add_to_periodic_task,‘date’,run_date=localtime) 中的 “add_to_periodic_task”是我需要执行的函数名称。
坑三:
ajax中需要增加async: true ,即异步执行任务。避免了后端等待时间过长页面提示“浏览器提示页面无响应,是否继续等待”。