定時(shí)任務(wù)apscheduler

項(xiàng)目的public文件夾下創(chuàng)建job.py文件

具體完成定時(shí)任務(wù)的創(chuàng)建、運(yùn)行、暫停、刪除操作

from public.log import *
from tasks import sched
from public.utils import import_method,task_time


class Job(object):
    def __init__(self,task_name):
        self.task_name = task_name

    # 添加定時(shí)任務(wù)并啟動(dòng)
    def add_cron_task(self,func,schedule):
        flag = 1
        try:
            func = import_method(func)
            job = func

            schedule = task_time(schedule)
            secends = schedule[0]
            minutes = schedule[1]
            hours = schedule[2]
            month = schedule[3]
            dayofweek = schedule[4]

            sched.add_job(job, 'cron',second=secends,minute=minutes,hour=hours,day_of_week=dayofweek,month=month, id = self.task_name)
            writeLog_info('[定時(shí)任務(wù):%s],添加成功' % (self.task_name))
            flag = 0
        except Exception as e:
            writeLog_error('[定時(shí)任務(wù):%s],添加失?。?s' % (self.task_name, str(e)))
        return flag


    # 暫停任務(wù)
    def pause_cron_task(self):
        flag = 1
        try:
            sched.pause_job(self.task_name)
            writeLog_info('[定時(shí)任務(wù):%s],暫停成功' % (self.task_name))
            flag = 0
        except Exception as e:
            writeLog_error('[定時(shí)任務(wù):%s],暫停失?。?s' % (self.task_name, str(e)))
        return flag

    # 恢復(fù)任務(wù)
    def resume_cron_task(self):
        flag = 1
        try:
            sched.resume_job(self.task_name)
            writeLog_info('[定時(shí)任務(wù):%s],重啟成功' % (self.task_name))
            flag = 0
        except Exception as e:
            writeLog_error('[定時(shí)任務(wù):%s],重啟失敗:%s' % (self.task_name, str(e)))
        return flag

    # 移除任務(wù)
    def remove_cron_task(self):
        flag = 1
        try:
            sched.remove_job(self.task_name)
            writeLog_info('[定時(shí)任務(wù):%s],刪除成功' % (self.task_name))
            flag = 0
        except Exception as e:
            writeLog_error('[定時(shí)任務(wù):%s],刪除失?。?s' % (self.task_name, str(e)))
        return flag

#判斷當(dāng)前是否有運(yùn)行中的定時(shí)任務(wù)
def is_exsit_task():
    flag = 1
    try:
        tasks = sched.get_jobs()
        if tasks:
            flag = 0
            writeLog_info('當(dāng)前運(yùn)行中的定時(shí)任務(wù):%s' % (tasks))
        else:
            flag = 1
            writeLog_info('暫無(wú)運(yùn)行中的定時(shí)任務(wù),需要手動(dòng)開(kāi)啟')
    except Exception as e:
        writeLog_error('定時(shí)任務(wù)獲取失?。?s'%(str(e)))
    return flag

這里在public/utils中寫了兩個(gè)數(shù)據(jù)處理方法import_method,task_time

#定時(shí)任務(wù)函數(shù)引用處理
def import_method(resource):
    resource = resource.split('.')
    moduel_name = resource[0]
    class_name = resource[1]
    method_name = resource[2]

    moduel =importlib.import_module(moduel_name+'.'+class_name)
    c = getattr(moduel,class_name)
    method = getattr(c(),method_name)
    return method


#定時(shí)任務(wù)執(zhí)行時(shí)間處理
def task_time(time):
    time_list = time.strip(',').split(',')
    return time_list

項(xiàng)目下新建tasks APP

models.py中將任務(wù)寫入數(shù)據(jù)庫(kù)

from django.db import models
# Create your models here.

class Task(models.Model):
    task_name = models.CharField(max_length=32,verbose_name=u'任務(wù)名稱',default="",primary_key=True)
    task_method = models.CharField(max_length=20,verbose_name=u'調(diào)用方法',default="")
    task_des = models.CharField(max_length=200,verbose_name=u'任務(wù)描述',default="")
    task_schedule = models.CharField(max_length=20,verbose_name=u'執(zhí)行計(jì)劃',default="")
    status = models.IntegerField(choices = ((0,u'運(yùn)行中'),(1,u'未開(kāi)啟')),default=0, verbose_name=u'項(xiàng)目狀態(tài)')
    update_time = models.DateTimeField(auto_now=True, verbose_name=u'更新時(shí)間')
    create_time = models.DateTimeField(auto_now_add=True, verbose_name=u'創(chuàng)建時(shí)間')

    class Meta:
        verbose_name =u'定時(shí)任務(wù)'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.task_name

tasks APP的init.py文件

default_app_config = 'tasks.apps.TasksConfig'

from apscheduler.schedulers.background import BackgroundScheduler
sched=BackgroundScheduler()
sched.start()

tasks APP的taskviews.py文件

# _*_ encoding:utf-8 _*_
from django.shortcuts import redirect, reverse
from django.shortcuts import HttpResponse
from public.job import *
import json
from .models import Task
from public.utils import *


# 定時(shí)任務(wù)列表
@login_Check
def task(request):
   try:
       is_exsit_task()
       tasks = Task.objects.all()
       writeLog_info("定時(shí)任務(wù)列表:%s" % tasks)
       return render(request, "../templates/tasks/task.html", {'tasks': tasks})
   except Exception as e:
       writeLog_info("定時(shí)任務(wù)列表獲取失敗:%s" % str(e))

# 定時(shí)任務(wù)創(chuàng)建
@login_Check
def add_task(request):
   if request.method == 'POST':
       task_name = request.POST.get("task_name")
       task_method = request.POST.get("task_method")
       task_des = request.POST.get("task_des")
       task_schedule = request.POST.get("task_schedule")

       isRepeat = len(Task.objects.filter(task_name=task_name).values())
       # 不重復(fù)則新增數(shù)據(jù)
       if isRepeat == 0:
           try:
               job = Job(task_name)
               if (job.add_cron_task(task_method, task_schedule)) == 0:
                   Task.objects.create(task_name=task_name, task_method=task_method, task_des=task_des,
                                       task_schedule=task_schedule)
                   writeLog_info(u"定時(shí)任務(wù)[%s],創(chuàng)建成功" % (task_name))
           except Exception as e:
               writeLog_error(u"定時(shí)任務(wù)創(chuàng)建失敗" % (str(e)))
       tasks = Task.objects.all()
       return render(request, "../templates/tasks/task.html", {'tasks': tasks,'isRepeat':isRepeat})


# 修改:任務(wù)回顯
@login_Check
def show_task(request):
   if request.method == 'POST':
       task_name = request.POST.get("task_name")
       task_obj = Task.objects.get(task_name=task_name)
       task_method = task_obj.task_method
       task_des = task_obj.task_des
       task_schedule = task_obj.task_schedule

       return HttpResponse(json.dumps({
           "task_name":task_name,
           "task_method": task_method,
           "task_des": task_des,
           "task_schedule": task_schedule,
           }))
   return redirect(reverse(task))
# 定時(shí)任務(wù)修改
@login_Check
def modify_task(request):
   if request.method == 'POST':
       task_name = request.POST.get("task_name")
       task_method = request.POST.get("task_method")
       task_des = request.POST.get("task_des")
       task_schedule = request.POST.get("task_schedule")
       status = 0
       try:
           job = Job(task_name)
           if (job.remove_cron_task()) == 0:
               Task.objects.filter(task_name=task_name).delete()
               if (job.add_cron_task(task_method, task_schedule)) == 0:
                   Task.objects.filter(task_name=task_name).update(task_method=task_method, task_des=task_des,
                                                                   task_schedule=task_schedule,status=status)
                   writeLog_info(u"定時(shí)任務(wù)[%s],更新成功" % (task_name))
               else:
                   writeLog_error(u"定時(shí)任務(wù)[%s],更新失敗" % (task_name))
           else:
               if (job.add_cron_task(task_method, task_schedule)) == 0:
                   Task.objects.filter(task_name=task_name).update(task_method=task_method, task_des=task_des,
                                                                   task_schedule=task_schedule,status=status)
                   writeLog_info(u"定時(shí)任務(wù)[%s],更新成功" % (task_name))
               else:
                   writeLog_error(u"定時(shí)任務(wù)[%s],更新失敗" % (task_name))
       except Exception as e:
           writeLog_error(u"定時(shí)任務(wù)[%s],更新失?。?s" % (task_name,str(e)))

   return redirect(reverse(task))

# 定時(shí)任務(wù)暫停
@login_Check
def pause_task(request):
   if request.method == 'POST':
       task_name = request.POST.get("task_name")

       try:
           job = Job(task_name)
           if (job.pause_cron_task()) == 0:
               Task.objects.filter(task_name=task_name).update(status=1)
               writeLog_info(u"定時(shí)任務(wù)[%s],暫停成功" % (task_name))
           else:
               Task.objects.filter(task_name=task_name).update(status=1)
               writeLog_info(u"定時(shí)任務(wù)[%s],暫停成功" % (task_name))
               return redirect(reverse(task))
       except Exception as e:
           writeLog_error(u"定時(shí)任務(wù)暫停失敗" % (str(e)))
   return redirect(reverse(task))

# 定時(shí)任務(wù)重啟
@login_Check
def restart_task(request):
   if request.method == 'POST':
       task_name = request.POST.get("task_name")

       try:
           job = Job(task_name)
           if (job.resume_cron_task()) == 0:
               Task.objects.filter(task_name=task_name).update(status=0)
               writeLog_info(u"定時(shí)任務(wù)[%s],重啟成功" % (task_name))
           else:
               obj = Task.objects.get(task_name=task_name)
               task_method = obj.task_method
               task_schedule = obj.task_schedule
               job.add_cron_task(task_method, task_schedule)
               Task.objects.filter(task_name=task_name).update(status = 0)
               writeLog_info(u"定時(shí)任務(wù)[%s],重啟成功" % (task_name))
               return redirect(reverse(task))
       except Exception as e:
           writeLog_error(u"定時(shí)任務(wù)重啟失敗" % (str(e)))
   return redirect(reverse(task))

# 定時(shí)任務(wù)刪除
@login_Check
def remove_task(request):
   if request.method == 'POST':
       task_name = request.POST.get("task_name")

       try:
           job = Job(task_name)
           if (job.remove_cron_task()) == 0:
               Task.objects.filter(task_name=task_name).delete()
           else:
               Task.objects.filter(task_name=task_name).delete()
           writeLog_info(u"定時(shí)任務(wù)[%s],刪除成功" % (task_name))
       except Exception as e:
           writeLog_error(u"定時(shí)任務(wù)刪除失敗" % (str(e)))
   return redirect(reverse(task))

tasks APP下的utls.py文件中添加路由分發(fā)

# _*_ coding:utf-8 _*_
__author__ = 'jessy'
__date__ = '2018/12/18 14:48'

from django.conf.urls import url
from . import taskviews

urlpatterns = [
    url('^taskinfo/$', taskviews.task),

    url('^taskinfo/add_task/$', taskviews.add_task),
    url('^taskinfo/show_task/$', taskviews.show_task),
    url('^taskinfo/modify_task/$', taskviews.modify_task),
    url('^taskinfo/pause_task/$', taskviews.pause_task),
    url('^taskinfo/restart_task/$', taskviews.restart_task),
    url('^taskinfo/remove_task/$', taskviews.remove_task),

]

templates/task文件夾下添加task.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    {% load bootstrap3 %}
    <title>Tasks</title>
    <script src="/static/bootstrap/js/jquery.min.js"></script>
    <script src="/static/js/bootstrap.min.js"></script>
    <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css">
    <link rel="stylesheet" href="/static/frame/layui/css/layui.css">
    <link rel="stylesheet" href="/static/frame/static/css/style.css">

    <script>
        $(function () {
            funisRepeat();
        });

        function funisRepeat() {
            var isRepeat;
            isRepeat = "{{ isRepeat }}";
            if (isRepeat == 1) {
                alert("任務(wù)名稱重復(fù)!");
            }
        }

        function getCookie(name) {
            var cookieValue = null;
            if (document.cookie && document.cookie != '') {
                var cookies = document.cookie.split(';');
                for (var i = 0; i < cookies.length; i++) {
                    var cookie = jQuery.trim(cookies[i]);
                    if (cookie.substring(0, name.length + 1) == (name + '=')) {
                        cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                        break;
                    }
                }
            }
            return cookieValue;
        }

        function csrfSafeMethod(method) {
            return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
        }

        //定時(shí)任務(wù)暫停
        function pauseTask(task_name) {
            //alert(id);
            if (!confirm("確認(rèn)要暫停:" + task_name + " 嗎?")) {
                return
            }
            $.ajax({
                url: '/task/taskinfo/pause_task/',
                type: 'POST',
                data: {'task_name': task_name},
                beforeSend: function (xhr, settings) {
                    var csrftoken = getCookie('csrftoken');
                    if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                        xhr.setRequestHeader("X-CSRFToken", csrftoken);
                    }
                },
                success: function (arg) {
                    alert("暫停成功!")
                    window.location.reload();
                }
            })
        }

        //定時(shí)任務(wù)重啟
        function restartTask(task_name) {
            //alert(id);
            if (!confirm("確認(rèn)要重啟:" + task_name + " 嗎?")) {
                return
            }
            $.ajax({
                url: '/task/taskinfo/restart_task/',
                type: 'POST',
                data: {'task_name': task_name},
                beforeSend: function (xhr, settings) {
                    var csrftoken = getCookie('csrftoken');
                    if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                        xhr.setRequestHeader("X-CSRFToken", csrftoken);
                    }
                },
                success: function (arg) {
                    alert("重啟成功!")
                    window.location.reload();
                }
            })
        }

        // 用戶信息回顯
        function showTask(task_name) {
            //alert(task_name);
            $.ajax({
                url: '/task/taskinfo/show_task/',
                type: 'POST',
                data: {'task_name': task_name},

                beforeSend: function (xhr, settings) {
                    var csrftoken = getCookie('csrftoken');
                    if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                        xhr.setRequestHeader("X-CSRFToken", csrftoken);
                    }
                },
                success: function (data) {
                    //alert(data);
                    var parseJson = jQuery.parseJSON(data)
                    $("#task_name_show").val(parseJson.task_name);
                    $("#task_method_show").val(parseJson.task_method);
                    $("#task_des_show").val(parseJson.task_des);
                    $('#task_schedule_show').val(parseJson.task_schedule);
                    $('#task_editMyModal').modal("show");
                },
            })
        }

        // 定時(shí)任務(wù)刪除
        function removeTask(task_name) {
            //alert(id);
            if (!confirm("確認(rèn)要?jiǎng)h除:" + task_name + " 嗎?")) {
                return
            }
            $.ajax({
                url: '/task/taskinfo/remove_task/',
                type: 'POST',
                data: {'task_name': task_name},
                beforeSend: function (xhr, settings) {
                    var csrftoken = getCookie('csrftoken');
                    if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                        xhr.setRequestHeader("X-CSRFToken", csrftoken);
                    }
                },
                success: function (arg) {
                    alert("刪除成功!")
                    window.location.reload();
                }
            })
        }


    </script>
</head>
<body role="document">
<!--定時(shí)任務(wù)列表-->
<div style="padding-top:20px;">
    <div class="layui-row layui-col-space15">
        <div class="layui-col-md10">
            <!--按鈕-->
            <div class="btn-group">
                <button id="btn1" class="layui-btn btn " data-toggle="modal" data-target="#task_addMyModal">
                    <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>定時(shí)任務(wù)
                </button>
            </div>
            <!--用戶列表-->
            <div style="padding-top:10px">
                <div>
                    <table id="table" table class="layui-table" lay-skin="line">
                        <thead>
                        <tr>
                            <th hidden>任務(wù)id</th>
                            <th>任務(wù)名稱</th>
                            <th>方法</th>
                            <th>描述</th>
                            <th>執(zhí)行計(jì)劃</th>
                            <th>狀態(tài)</th>
                            <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;操作</th>
                        </tr>
                        </thead>
                        <tbody>
                        {% for task in tasks %}
                            <tr>
                                <td class="list" hidden>{{ task.id }}</td>
                                <td class="list" width="180">{{ task.task_name }}</td>
                                <td class="list" width="180">{{ task.task_method }}</td>
                                <td class="list" width="180">{{ task.task_des }}</td>
                                <td class="list" width="180">{{ task.task_schedule }}</td>
                                <td class="list" width="180">
                                    {% if task.status == 1 %}
                                        <a style="color:red">{{ task.get_status_display }}</a>
                                    {% else %}
                                        <a style="color:yellowgreen">{{ task.get_status_display }}</a>
                                    {% endif %}
                                </td>
                                <td class="list" width="250">
                                    {% if task.status == 1 %}
                                        <a id="task_start" href="javascript:void(0)"
                                           onclick="restartTask('{{ task.task_name }}')">
                                            <img src="/static/admin/img/icon-yes.svg">重啟</a>
                                        <a id="task_modify" href="javascript:void(0)"
                                           onclick="showTask('{{ task.task_name }}')">
                                            <img src="/static/admin/img/icon-changelink.svg">修改</a>
                                        <a href="javascript:void(0)"
                                           onclick="removeTask('{{ task.task_name }}')">
                                            <img src="/static/admin/img/icon-deletelink.svg">刪除
                                        </a>
                                    {% else %}
                                        <a id="task_pause" href="javascript:void(0)"
                                           onclick="pauseTask('{{ task.task_name }}')">
                                            <img src="/static/admin/img/icon-alert.svg">暫停</a>
                                        <a href="javascript:void(0)"
                                           onclick="removeTask('{{ task.task_name }}')">
                                        <img src="/static/admin/img/icon-deletelink.svg">刪除
                                    {% endif %}

                                </td>
                            </tr>
                        {% endfor %}
                        </tbody>
                    </table>
                </div>
            </div>
        </div>
    </div>
</div>

<!-- 模態(tài)框示例(Modal) -->
<!-- 新增定時(shí)任務(wù)-->
<div class="modal fade" id="task_addMyModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"
     aria-hidden="true">
    <div class="modal-dialog" style="max-width:800px">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">
                    &times;
                </button>
                <h3 class="modal-title" id="myModalLabel">
                    <p style="font-size: medium">新增定時(shí)任務(wù)</p>
                </h3>
            </div>
            <div class="modal-body">
                <form id='addMenu' role="form" method='POST' action="/task/taskinfo/add_task/">
                    <div class="form-group">
                        <label for="task_name">任務(wù)名稱</label>
                        <input type="text" class="form-control" name="task_name" placeholder="請(qǐng)輸入任務(wù)名稱" required
                               maxlength="32">
                    </div>
                    <div class="form-group">
                        <label for="task_method">調(diào)用方法</label>
                        <input type="text" class="form-control" name="task_method" placeholder="請(qǐng)輸入調(diào)用方法" required
                               maxlength="20">
                    </div>
                    <div class="form-group">
                        <label for="task_des">描述</label>
                        <input type="text" class="form-control" name="task_des" placeholder="請(qǐng)輸入描述信息" required
                               maxlength="200">
                    </div>
                    <div class="form-group">
                        <label for="task_schedule">執(zhí)行計(jì)劃(秒,分,小時(shí),月,天/周)</label>
                        <input type="text" class="form-control" name="task_schedule"
                               placeholder="請(qǐng)輸入執(zhí)行計(jì)劃(例:*/10,*,*,*,*)" maxlength="20">
                    </div>
                    <div class="modal-footer">
                        <button type="button" class="btn layui-btn" data-dismiss="modal">關(guān)閉
                        </button>
                        <button type="submit" class="btn layui-btn">
                            提交
                        </button>
                    </div>
                    {% csrf_token %}
                </form>
            </div>
        </div><!-- /.modal-content -->
    </div><!-- /.modal -->
</div>
<!-- 修改定時(shí)任務(wù)-->
<div class="modal fade" id="task_editMyModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"
     aria-hidden="true">
    <div class="modal-dialog" style="max-width:800px">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">
                    &times;
                </button>
                <h3 class="modal-title" id="myModalLabel">
                    <p style="font-size: medium">定時(shí)任務(wù)修改</p>
                </h3>
            </div>
            <div class="modal-body">
                <form id='modifyMenu' role="form" method='POST' action="/task/taskinfo/modify_task/">
                    <div class="form-group" style="display: none">
                        <label for="id">id</label>
                        <input id="user_id" type="text" class=" form-control" name="id" placeholder="請(qǐng)輸入id">
                    </div>
                    <div class="form-group">
                        <label for="task_name">任務(wù)名稱</label>
                        <input id="task_name_show" type="text" class="form-control" name="task_name" required
                               maxlength="32" readonly="readonly">
                    </div>
                    <div class="form-group">
                        <label for="task_method">調(diào)用方法</label>
                        <input id="task_method_show" type="text" class="form-control" name="task_method"
                               placeholder="請(qǐng)輸入調(diào)用方法" required maxlength="20">
                    </div>
                    <div class="form-group">
                        <label for="task_des">描述</label>
                        <input id="task_des_show" type="text" class="form-control" name="task_des" placeholder="請(qǐng)輸入描述信息"
                               required maxlength="200">
                    </div>
                    <div class="form-group">
                        <label for="task_schedule">執(zhí)行計(jì)劃(秒,分,小時(shí),月,天/周)</label>
                        <input id="task_schedule_show" type="text" class="form-control" name="task_schedule"
                               placeholder="請(qǐng)輸入執(zhí)行計(jì)劃(例:*/10,*,*,*,*)" maxlength="20">
                    </div>
                    <div class="modal-footer">
                        <button type="button" class="btn layui-btn" data-dismiss="modal">關(guān)閉
                        </button>
                        <button type="submit" class="btn layui-btn">
                            提交
                        </button>
                    </div>
                    {% csrf_token %}
                </form>
            </div>
        </div><!-- /.modal-content -->
    </div><!-- /.modal -->
</div>

</body>
</html>
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容