通过django-crontab实现定时任务并在后台进行简单管理

1、安装django-crontab:

pip install django-crontab

2、部署

a、在setting.py文件里面进行app引入

INSTALLED_APPS = [
    ……
    'django_crontab',
    ……
]

b、在app目录下面创建一个cron_syn.py文件(文件名可自定义),并在文件内创建定时任务需要执行的函数

<1>、创建好的文件目录:

 

 <2>、创建定时任务的函数:

def test_cron():
    print('测试定时任务')

<3>、在setting.py文件里面进行定时任务配置:

CRONJOBS = [
    #测试定时任务
    ('*/5 * * * *', 'php_app.cron_syn.test_cron','>>/var/log/odoo/test.log'),
  …… ]

tips:关于定时任务周期的问题,网上很多大佬做了比较详细的说明,这里就不多作解释了

3、定时任务操作

python manage.py crontab add #添加定时任务
python manage.py crontab remove #移除定时任务
python manage.py crontab show #展示当前定时任务

说明:django-crontab是基于linux系统的,所以windows系统里面无法使用,以上内容在官方文档里面都可以看得到,官方文档:https://pypi.org/project/django-crontab/

4、后台管理

由于在使用crontab的过程中,对定时任务的移除操作比较麻烦(每次都要本地手动更改代码,上传线上,合并,服务器下拉,重启django服务,重新添加定时任务),当然,也可能是本人太菜,没找到其它合适的办法....,所以,做了一个简单的后台管理,控制定时任务的开启和关闭,以及重复运行的问题(当运行时间大于任务周期时可用)

a、在models.py文件里面创建定时任务管理模型(D:\Backend\php_app\models.py):

class TimedTask(models.Model):
    name = models.CharField(max_length=128,unique=True) #定时任务函数名称
    title = models.CharField(max_length=128,unique=True) #定时任务名称
    state_choice = (
        (0,'运行中'),
        (1,'就绪'),
    )
    status = models.IntegerField(choices=state_choice,default=1)  #运行状态
    open_state = (
        (1,'开启'),
        (0,'关闭'),
    )
    is_open = models.IntegerField(choices=open_state,default=1)  #开启(关闭)状态 
    update_time = models.DateTimeField(null=True)
    description = models.TextField(null=True)  #任务描述

b、在对应的数据表里面插入数据(name字段的值务必与函数名保持一致)

 

 

c、通过装饰器函数控制定时任务

def timed_task(func):
    '''
    限制定时任务:当任务状态为关闭时,不执行定时任务
    在当前任务执行过程中,如果一直到下一下周期还没执行完毕,则一直等到当前任务执行完成再执行下一次任务
    
    :param func:
    :return:
    '''
    def inner():
        cron_obj = model.TimedTask.objects.filter(name=func.__name__).first()
        if cron_obj.is_open:
            if cron_obj.status:
                cron_obj.status = 0
                cron_obj.save()
                func()
                cron_obj.status = 1
                cron_obj.update_time = datetime.datetime.now()
                cron_obj.save()
            else:
                print('当前任务正在运行中……')
        else:
            print('当前任务已关闭!')
    return inner


@timed_task
def test_cron():
print('测试定时任务')

d、通过后台页面去控制定时任务的打开或关闭状态,这一步其实就是通过ORM去操作对应函数的status和is_open字段,就不多赘述了,直接上效果图吧

 

 

 

 

 

最后:还有很多不完善的地方,欢迎各位大佬提出宝贵意见,如果有其它方法,欢迎留言相互学习。

-- 需要细节代码的小伙伴欢迎留言,主要是懒得写。。。。哈哈

 

posted @ 2021-08-05 11:14  LiQ0112  阅读(832)  评论(0)    收藏  举报