django作为一个成熟稳定的后端框架,拥有很多的第三方插件,关于定时任务管理比较常用的是crontab,scheduler,celery,APScheduler,每种框架都各有优缺点,这里不做详细比较,结论是个人推荐使用APScheduler。
本文主要介绍django-crontab,原因是接手应用程序初期,linux主机上配置了很多定时任务,所以采用了最简单的方式,使用django-crontab将定时任务纳入程序中统一管理,最简单直接的方式就是使用django-crontab组件。该组件的原理是修改linux上的crontab定时任务,所以不支持windows操作系统,而且修改定时任务执行频率也需要修改settings.py文件,所以并不是很方便,但是针对简单的应用,不需要经常调整定时任务的话,使用这个组件是最简单的了。
一、安装
pip install django-crontab
二、配置
安装后,在settings.py的INSTALLED_APPS注册本组件
INSTALLED_APPS = ( 'django_crontab', ... )
三、定义定时任务执行方法,比如在myapp/tasks.py中写以下代码:
def my_scheduled_job(): print('my job is executed!')
四、添加任务
在settings.py中配置CRONJOBS,可以添加多个任务,任务的格式是 cron表达式,任务方法名称,关于cron表达式本文不展开介绍。
CRONJOBS = [ # 每5分钟执行一次 ('*/5 * * * *', 'myapp.cron.my_scheduled_job') ]
五、管理任务
django-crontab组件中定义了几个命令用于管理定时任务
# 添加当前项目中定义的任务 python manage.py crontab add # 显示当前系统中有效的任务 python manage.py crontab show # 从系统中移除当前项目中定义的任务 python manage.py crontab remove
在应用程序部署后,需要执行 python manage.py crontab add 使定时任务生效,检查任务是否生效的方法可以用系统命令
# 列出定时任务 $ contab -l # 编辑定时任务 $ contab -e
另外,这个方式不支持集群化使用,如果要在集群中使用,需要在定时任务方法里手动给定时任务加锁,比如使用redis锁的方式保证同一时间只有一个任务在执行。
另外,如果使用容器化方式部署,且基础镜像是alpine时,记得在开启crond服务, 以下是我的Dockerfile和起动脚本
FROM python:3.12.5-alpine EXPOSE 8000 ... CMD ["sh", "./start.sh"]
crond python manage.py crontab add python manage.py runserver # 如果使用gunicorn # gunicorn -c /myproj/gunicorn.conf.py myproj.wsgi
在alpine系统里,crond必须在启动命令的第一行
关于gunicorn的使用,有专门的章节介绍
2025/9/14 于北京 上东廓