通过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字段,就不多赘述了,直接上效果图吧


最后:还有很多不完善的地方,欢迎各位大佬提出宝贵意见,如果有其它方法,欢迎留言相互学习。
-- 需要细节代码的小伙伴欢迎留言,主要是懒得写。。。。哈哈

浙公网安备 33010602011771号