Django的定时任务
Django-crontab 可以实现Django的定时任务,github主页地址:https://github.com/kraiz/django-crontab
定时任务的格式设置如下:
CRONJOBS = [
('*/5 * * * *', 'myapp.cron.my_scheduled_job'),
# format 1
('0 0 1 * *', 'myapp.cron.my_scheduled_job', '>> /tmp/scheduled_job.log'),
# format 2
('0 0 1 * *', 'myapp.cron.other_scheduled_job', ['myapp']),
('0 0 * * 0', 'django.core.management.call_command', ['dumpdata', 'auth'], {'indent': 4}, '> /home/john/backups/last_sunday_auth_backup.json'),
]
任务定义的参数说明如下:
格式1:
A: 必要参数, 定义参数的执行时间 .eg: 每5分钟执行一次 "*/5 * * * *" ; 每天的12:00执行一次 "0 12 * * *".这里的时间定义可参考链接 [https://crontab.guru/examples.html]
B: 必要参数, Python 函数的路径. 某个APP下面定义的函数. Eg: myapp 的cron.py文件中定义的 my_scheduled_job 函数 'myapp.cron.my_scheduled_job'
C: 可选参数 , 任务的特殊说明 eg: 将结果输出到日志文件 '>> /tmp/scheduled_job.log'
格式2:
A: 必要参数, 定义参数的执行时间 .eg: 每5分钟执行一次 "*/5 * * * *" ; 每天的12:00执行一次 "0 12 * * *".这里的时间定义可参考链接 [https://crontab.guru/examples.html]
B: 必要参数, Python 命令调用路径, 如果是 自定义的command命令,这里应该设置为 'django.core.management.call_command'
C:可选参数 命令或函数的参数[] eg: dumpdata 是数据备份的命令, auth 是表格名,这里作为dumpdata 的命令参数 ['dumpdata', 'auth']
D:可选参数命令或函数的参数 eg: dumpdata的可选参数 –indent,值设置为 4 {'indent': 4}
E: 可选参数 , 任务的特殊说明 eg: 将结果输出到日志文件 '>> /tmp/scheduled_job.log'
这里补充一下Python的自定义命令:
参考链接 https://docs.djangoproject.com/en/2.0/howto/custom-management-commands/
polls/ __init__.py models.py management/ __init__.py commands/ __init__.py _private.py closepoll.py tests.py views.py |
参考上面的目录创建文件 closepoll.py , _private.py , __init__.py , 编写closepoll.py的内容如下:
from django.core.management.base import BaseCommand, CommandError from testApp.models import Poll
class Command(BaseCommand): help = 'Closes the specified poll for voting'
def add_arguments(self, parser): parser.add_argument('poll_id', nargs='+', type=int)
parser.add_argument( '--delete', action='store_true', dest='delete', help='Delete poll instead of closing it', )
def handle(self, *args, **options): for poll_id in options['poll_id']: try: poll = Poll.objects.get(pk=poll_id) except Poll.DoesNotExist: raise CommandError('Poll "%s" does not exist' % poll_id)
if options['delete']: poll.delete() self.stdout.write(self.style.SUCCESS('Deleted poll: "%s"' % poll.name))
else: poll.opened = False poll.save() self.stdout.write(self.style.SUCCESS('Successfully closed poll: "%s"' % poll.name)) |
testApp的models.py 文件内容如下:
from django.db import models
# Create your models here.
class Poll(models.Model): name = models.CharField(max_length=20) opened = models.BooleanField(default=False) |
Admin.py 内容如下:
from django.contrib import admin
# Register your models here. from testApp.models import Poll
admin.site.register(Poll) |
写好之后测试命令:
(metro8web) D:\virtualEnv \CustomCmd>python manage.py closepoll 3 Successfully closed poll: "quest poll" |
这里 closepoll 是命令名称 3 是该命名附带的参数
(metro8web) D:\virtualEnv\CustomCmd>python manage.py closepoll 3 --delete Deleted poll: "quest poll" |
这里附带 –delete 参数可以删除一条数据记录
该命令的 crontab 任务设置格式应为:
CRONJOBS = [ ('*/7 * * * *', 'django.core.management.call_command', ['closepoll', '1', ], '> /var/www/backup1.json'),
('*/5 * * * *', 'django.core.management.call_command', ['closepoll', '1' ] , {'delete': ''} ) ]
这里的命令是在 windows的cmd 命令窗口中执行的,Linux 下同样可以使用。
下面开始说说crontab ,crontab 是Linux 系统中的定时认为管理器,用来定时执行一些任务,windows下不能用,因此django-crontab 只能在linux环境下使用。
在linux环境下使用命令: crontab –l 和 /etc/init.d/cron status 可以查看系统的定时任务列表和指定任务的执行记录,截图如下:
这里的定时任务实际上和Django 没有关系,django-crontab 要做的事情是把 需要定时执行的任务放在 crontab的任务列表中。系统会自动定时执行,与Django是否运行没有关系。
这里还可以测试定时任务是否能正确执行,在定时任务列表中,复制任务的命令行,直接执行,可看到执行结果的输出或错误提示。
最后是django-crontab 的命令: add; remove ; show ,按照 Django-crontab 的github 文档编写好任务函数和设置文件,执行命令
Python manage.py crontab add
每次修改 CRONJOBS 变量后,需要重新执行上面的命令来更新 crontab 任务列表。
参考链接 http://blog.csdn.net/yongche_shi/article/details/48683529