当前位置: 移动技术网 > IT编程>脚本编程>Python > Django的定时任务

Django的定时任务

2018年03月15日  | 移动技术网IT编程  | 我要评论

poping舞曲,tokyo hot n0649,埃尼欧

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网