django 定时任务 django-crontab 的使用
1、前言
在做 django 开发需求时,多多少少都会遇到需要定时任务的功能,比如定时执行任务,检查订单之类的。可能是一段时间,比如每隔 10分钟执行一次,也可能是定点时间,比如 14:00 执行,也可能是长时间,比如每周几,每个月的哪一天等。查看了一下相关资料, django 定时任务 django-crontab
库比较多教程和资料,虽然 star 数才五百,但是 API 接口比较简单,接入也很方便,功能也很全面,当然,也存在一此无法解决的问题,使用时需要注意的。
2、使用教程
1.安装:
pip install django-crontab
2.添加配置到 settings.py INSTALLED_APPS
中
INSTALLED_APPS = ( 'django_crontab', ... )
3.编写定时函数:
定时任务可以分成两种,一种是执行自定义的
mange.py
的命令,另一种是执行自定义函数。
在django的app中新建一个myapp/cron.py文件,把需要定时执行的代码放进去
示例:
def my_scheduled_job(): pass
4.在 settings.py 中增加CRONJOBS
配置
CRONJOBS = [ ('*/5 * * * *', 'myapp.cron.my_scheduled_job') ]
也可以定义一些关键字参数,有2种格式:
格式1:
- 要求:cron计时通常格式(有关更多示例,请参阅 Wikipedia 和 crontab.guru)
- 要求:python模块路径下待执行定时任务
- 可选:特定于定时任务的后缀(例如,将
out/err
重定向到文件,默认值为'')
示例:
CRONJOBS = [ ('*/1 * * * *', 'appname.test_crontab.test','>>/home/python/test_crontab.log') ]
注意: >>
表示追加写入,>
表示覆盖写入。
格式2:
- 要求:cron计时通常格式
- 要求:python模块路径下待执行定时任务
- 可选:方法的位置参数列表(默认值:[])
- 可选:方法的关键字参数的dict(默认值:{})
- 可选:特定于定时任务的后缀(例如,将
out/err
重定向到文件,默认值为'')
示例:
CRONJOBS = [ ('*/5 * * * *', 'myapp.cron.other_scheduled_job', ['arg1', 'arg2'], {'verbose': 0}), ('0 4 * * *', 'django.core.management.call_command', ['clearsessions']), ]
对于熟悉 Linux 中定时任务crontab
的同学可能对上面第一个参数的语法很亲切。上面表示每隔1分钟执行一次代码。
Linux 中的定时任务crontab
的语法如下:
* * * * * command 分钟(0-59) 小时(0-23) 每个月的哪一天(1-31) 月份(1-12) 周几(0-6) shell脚本或者命令
有几个特殊的符号:
* 代表所有的取值范围的数字 / 代表每的意思,*/5就是每5个单位 - 代表从某个数字到某个数字 , 分开几个离散的数字
示例:
每两个小时 0 */2 * * * 晚上11点到早上8点之间每两个小时,早上8点 0 23-7,8 * * * 每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点 0 11 4 * 1-3 1月1日早上4点 0 4 1 1 *
0 6 * * * commands >> /tmp/test.log # 每天早上6点执行, 并将信息追加到test.log中 0 */2 * * * commands # 每隔2小时执行一次
有兴趣的小伙伴可以深入研究下 Linux 的crontab
定时任务。如果不了解和不熟悉可以想看: cron语法格式学习
5.添加并启动定时任务
#添加并启动定时任务 python manage.py crontab add
其它命令:
#显示当前的定时任务 python manage.py crontab show #删除所有定时任务 python manage.py crontab remove
一些问题
如果配置成这样:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) CRONJOBS = [ ('0 7 * * 1-5', 'api.cron.email_to_late_docs', '>> {}'.format(BASE_DIR + '/logs/log_{:%d_%m_%Y}.log'.format(time.now()))), ('0 7 * * 1-5', 'api.cron.email_ten_days_before', '>> {}'.format(BASE_DIR + 'logs/log_{:%d_%m_%Y}.log'.format(time.now()))) ]
上述代码的目的是,希望对任务的输出和错误日志,进行 log_ddmmYY
格式进行文件每天分开保存。
但是这个任务,在第二天时,就不会在执行啦!!
因为,CRONJOBS
生成任务时,会生成对应的哈希值(hashes),标识每个任务。所以,当文件名变更时,CRONJOBS
中的值每天都在变化,导致不同的定时任务哈希值(hashes)。
针对这种情况,解决方法是,日志文件名称固定,然后创建一个任务,用来每天把日志文件重命名(move)成想要的格式名称,这样就可以啦!
总结
通过这个需求,可以看到很多知识点其实是串联起来的,从python
到django
到Linux
的crontab
,所以,学习无止境,知识学习只会越来越多,如果你提前掌握了某些知识,那么学习新(旧)知识的成本就会降低很多,或者理解成本,比如你学习了 Linux
, 了解过 cron
,那么对于学习这个 django
的定时任务会轻松很多!永远不要认为有些知识你永远用不上,所以现在就不学,可能现在的永远距离已经很短啦!加油~
参考
- kraiz/django-crontab: dead simple crontab powered job scheduling for django.
- django开发-定时任务的使用 - wyzane - SegmentFault 思否
- django-crontab 定时执行任务方法 - 程序园
- django-crontab实现Django定时任务
- django使用django-crontab实现定时任务 - 简书
- 使用django-crontab实现定时任务 - 腾讯云
- cron语法格式学习 - 简书
- django-crontab is missing job hash after one day · Issue #76 · kraiz/django-crontab
- Cron Format - Wikipedia
- crontab.guru
- 如有疑问,欢迎在评论区一起讨论!
- 如有不正确的地方,欢迎指导!
注:本文首发于 iHTCboy's blog,如若转载,请注来源
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
JavaScript - 元素拖动
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>JavaScript实现元素拖动</title> <style> *{ margin: 0; } #app{ width: 100vw; height: 100vh; background: #9acfea; position: relative; } #content{ width: 100px; height: 100px; position: fixed; background: #ff6700; border-radius: 10px; cursor: pointer; } </style> </head> <body> <div id="app"> <div id="content" data-type="0"></div> </div> <script type="...
- 下一篇
macOS 使用 Sparkle 检查软件自更新
1、前言 其实,本篇文章应该是上一年就打算写的,结果呢,最近才有时间整理。开发 macOS 软件也有一段时间,对于软件更新,之前是自己手动编写增加 API 接口来提示是否有新版本,但一直觉得不智能,界面也不友好,而且下载的是压缩包,需要解压后自动手动替换 App,甚是痛苦。所以,看了很多开源项目,看到了一个 macOS 专用的更新库 Sparkle, 然而现有网上的教程,已经非常陈旧,花了点时间才悟,所以,写一个总结吧。另外,也有其它的更新库,大家需要可以自行了解,以主流库为主,维护更好,这也是项目选型考虑的条件之一,也许是强者更强,好像劣币驱逐良币现象在开源界没有发生过吧~ 2、Sparkle Sparkle的原理是根据提前配置好的xml文件地址,每次启动后解析xml,看看有没有比当前版本新的数据,有的话提示更新。xml文件可以存在任何可以访问xml元数据的服务器,包括 GitHub 仓库。 2.1 使用 Cocopods 在项目中集成: pod 'Sparkle' 也可以通过下载源代码进行集成(https://github.com/sparkle-project/Sparkle)。...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS6,CentOS7官方镜像安装Oracle11G
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- 设置Eclipse缩进为4个空格,增强代码规范