Django项目定时任务--django-crontab

Django项目使用定时任务

Django实现定时任务的方法有很多种,如果是简单的场景,固定时间进行定时任务,不需要动态的进行配置定时时间,使用django的django-crontab可以很好的实现。django-crontab是利用django的配置去生成一个操作系统层的crontab定时任务。可以与django的项目进行结合,调用函数模型等会更便捷。定时任务一旦开启,则会在操作系统后台一直运行。使用场景根据情况而定。大多都是定时执行django的视图or函数


首先安装django-crontab

pip install django-crontab

在setting.py中添加应用 (在注册app之上)
INSTALLED_APPS = [
    ...
    'django_crontab',  
]

在setting.py中添加定时任务
CRONJOBS = [
	# 每分钟发送一条通知
	# app:为应用名,cron为py文件名,inform为文件中的函数
    ('*/1 * * * *', 'app.cron.inform', '>> ' + os.path.join(os.path.dirname(BASE_DIR), 'logs/crontab.log'))
]

第一部分为定时任务的执行间隔,第二部分为任务执行文件路径,第三部分为日志路径
(在服务器运行的时候,可以在django目录写个py文件去测试第三部分的拼接是什么,方便到时候找日志)

项目目录截图:
Django项目定时任务--django-crontab_第1张图片

解决中文字符问题
如果cron文件中有非英文字符,则需要在setting.py中加上

CRONTAB_COMMAND_PREFIX = 'LANG_ALL=zh_cn.UTF-8'

完成以上配置后,就可以使用命令进入Django项目的路径(可以输入python manage.py runserver的路径)
进行添加定时任务启动

开启定时任务

python manage.py crontab add

显示已经激活的定时任务

python manage.py crontab show

移除定时任务(不移除将一直存在系统后台运行)

python manage.py crontab remove

直接运行定时任务(提前运行而已不影响任务)(任务id在你add的时候前面有一个哈希的id)

python manage.py crontab run <任务id>

基本格式 :

    * * * * *

    分 时 日 月 周      命令
    M: 分钟(0-59)。每分钟用*或者 */1表示
    H:小时(0-23)。(0表示0点)
    D:天(1-31)。
    m: 月(1-12)。
    d: 一星期内的天(0~60为星期天)。
第一个星号代表分钟,第二个代表小时,第三个代表天,第四个代表月,第五个代表一星期内的第几天

注意:'1 * * * *' 代表每个小时的第一分钟执行定时任务,即,每小时才会更新一次。
我们如果要设置每分钟执行一次定时任务,则需要使用以下
'*/1 * * * *'

'0 */1 * * *'  # 每1小时执行一次
'0 10 * * *'	# 每天10点执行
'30 19 * * *'	# 每天19点30分执行
'0 10 * * 1'	# 每周一10点执行
'30 17 * * 5'	# 每周五17点30分执行
'0 10 1 10 *'	# 每年10月1日10点执行
'0 5,17 * * *'	# 每天5:00和17:00执行任务

"""
设置时间组合:

1 * * * * reboot #表示每个小时的1分开始执行 例如 1:1分 2:1分 3:1分
*/1 * * * * reboot #这里的*/1表示每隔一分钟就执行reboot命令了,一小时执行60次
*/5 * * * * reboot #每隔5分钟执行一次,一小时执行12次
1 1,2 * * * reboot #其中的1,2代表每天的1点和2点的第一分钟的时候执行reboot命令,中间的逗号表示不同的时间点
1 1-3 * * * reboot #其中的1-3表示每天的1点到3点的第一分钟的时候执行reboot命令。“-”可以表示一个时间的范围
1 1 1 * * reboot #表示每个月1号的1点1分执行一次reboot
1 1 1-10 * * reboot #表示每个月1到10号都执行一次reboot
1 1 * 1 * reboot #每年1月的每天执行一次重启
1 1 * * 1 reboot #星期一执行一次重启
"""

"""
设置时间结构:

 ┌────────── minute (0 - 59)
 │ ┌──────── hour (0 - 23)
 │ │ ┌────── day of month (1 - 31)
 │ │ │ ┌──── month (1 - 12)
 │ │ │ │ ┌── day of week (0 - 6 => Sunday - Saturday, or
 │ │ │ │ │                1 - 7 => Monday - Sunday)
 ↓ ↓ ↓ ↓ ↓
 * * * * * command to be executed
"""




# 操作系统中存在的定时任务
crontab -e
# 查看系统中存在的定时任务
crontab -l

PS:django-crontab生成的定时任务是基于的操作系统的crontab定时任务,仅在linux和mac系统下可以使用,windows系统不可以使用。进行定时的任务确保没有逻辑or语法bug,可以先在本机测试定时任务是无误的,可以在cron函数中编写简单的print(666)进行测试,会将666输出到log日志中,可以到对应位置查看日志,确保定时任务无误。另外定时任务的开启和django项目的启动无关系

更新PS:要打印日志的话一定要确保文件夹存在,例如

 ('00 11 * * *', 'app.cron.spider', '>> ' + os.path.join(os.path.dirname(BASE_DIR), 'logs_2023_7/crontabs.log')),

请确保在Django项目同级别目录有logs_2023_7。如果没有logs_2023_7的话。日志就写不进去

Django项目定时任务--django-crontab_第2张图片

PS:之前一个任务死循环了,一直在跑,就把crontab的进程噶了,然后重新跑日志没了,解决方法:重启crontab。我是debian的系统,sudo service cron restart然后就好了

PS:Django任务一直跑就行了,cron这个文件和setting文件随便改了随便丢,然后重新remove add就完事了。不需要重启django项目

你可能感兴趣的:(Python,Django,django,python,后端,linux,服务器)