Django的定時任務,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