欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Django的定时任务

程序员文章站 2022-07-09 18:19:28
Django-crontab 可以实现Django的定时任务,github主页地址:https://github.com/kraiz/django-crontab 定时任务的格式设置如下: CRONJOBS = [ ('*/5 * * * *', 'myapp.cron.my_scheduled_j ......

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 没有关系,django-crontab 要做的事情是把 需要定时执行的任务放在 crontab的任务列表中。系统会自动定时执行,与Django是否运行没有关系。

 

这里还可以测试定时任务是否能正确执行,在定时任务列表中,复制任务的命令行,直接执行,可看到执行结果的输出或错误提示。

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