Django 前端发送定时任务时间+Apscheduler 后端接收时间 实现定时任务

版权声明:转载请注明出处 https://blog.csdn.net/GG9527li/article/details/86502360

首先偶作开始想要的功能是前端发送一个执行任务的时间,后端收到时间后执行。百度了一圈文章不是转载就是抄!!最开始选的是Apscheduler, 搞了1天没有实现要的功能,然后试了试celery …我只能说功能多但是复杂(还难用)需要启动很多的监听工具。最后还是选Apscheduler。吐槽一些github中作者给了一些例子,但是用处不大,最后还是只能自己改写,Apscheduler中遇到的报错等问题基本上可以在github issue中找到答案。
https://github.com/agronholm/apscheduler

说说我的实现步骤:

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 ,即异步执行任务。避免了后端等待时间过长页面提示“浏览器提示页面无响应,是否继续等待”。

猜你喜欢

转载自blog.csdn.net/GG9527li/article/details/86502360