Django定時任務Django-crontab的使用

劉帥強發表於2022-07-07

在使用的django做測試平臺時,,多多少少都會遇到需要定時任務的功能,比如定時執行任務,檢查訂單之類
的。可能是一段時間,比如每隔 10分鐘執行一次,也可能是定點時間,比如 14:00 執行,也可能是長時
間,比如每週幾,每個月的哪一天等。檢視了一下相關資料, django 定時任務 django-crontab 庫比
較多教程和資料,雖然 star 數才五百,但是 API 介面比較簡單,接入也很方便,功能也很全面,當然,
也存在一此無法解決的問題,使用時需要注意的

  1. 使用 pip install django-crontab
  2. 新增配置檔案到settings.py INSTALLED_APPS 中,
    INSTALLED_APPS = (
    'django_crontab',
    )
    
  3. 編寫定時函式

    定時任務分為兩類,一種是執行自定義的manage.py,另一種是執行自定義函式

在Django中的app中新建一個myapp/cron.py 檔案,把需要定時的程式碼放進去

def my_schedule_job():
	pass
  1. 在setting.py中增加CEONJOBS配置
CRONJOBS = [
('*/5 * * * *', 'myapp.cron.my_scheduled_job')
]

也可以定義一些關鍵字引數,有2種格式:
格式1:
要求:cron計時通常格式(有關更多示例,請參閱 Wikipedia 和 crontab.guru)
要求:python模組路徑下待執行定時任務
可選:特定於定時任務的字尾(例如,將 out/err 重定向到檔案,預設值為'')

CRONJOBS = [
('*/1 * * * *',
'appname.test_crontab.test','>>/home/python/test_crontab.log')
]

注意: >> 表示追加寫入, > 表示覆蓋寫入。
格式2:
要求:cron計時通常格式
要求:python模組路徑下待執行定時任務
可選:方法的位置引數列表(預設值:[])
可選:方法的關鍵字引數的dict(預設值:{})
可選:特定於定時任務的字尾(例如,將 out/err 重定向到檔案,預設值為'')

CRONJOBS = [
('*/5 * * * *', 'myapp.cron.other_scheduled_job', ['arg1', 'arg2'],
{'verbose': 0}),
('0 4 * * *', 'django.core.management.call_command', ['clearsessions']),
]

對於熟悉 Linux 中定時任務 crontab 的同學可能對上面第一個引數的語法很親切。上面表示每隔1分鐘
執行一次程式碼。
Linux 中的定時任務 crontab 的語法如下:

* * * * * command
分鐘(0-59) 小時(0-23) 每個月的哪一天(1-31) 月份(1-12) 周幾(0-6) shell指令碼或者命令
* 代表所有的取值範圍的數字
/ 代表每的意思,*/5 就是5個單位
- 代表從某個數字到某個數字
,分來幾個離散的數字
---------------------------
每兩個小時 0 */2 * * *
晚上11點到早上8點之間每兩個小時,早上8點 0 23-7,8 * * *
每個月的4號和每個禮拜的禮拜一到禮拜三的早上11點 0 11 4 * 1-3
1月1日早上4點 0 4 1 1 *
0 6 * * * commands >> /tmp/test.log # 每天早上6點執行, 並將資訊追加到test.log中
0 */2 * * * commands # 每隔2小時執行一次
  1. 新增並啟動定時任務
# 新增並啟動定時任務
python manage.py crontab add 

其他命令

#顯示當前的定時任務
python manage.py crontab show
#刪除所有定時任務
python manage.py crontab remove

總結
測試平臺執行測試用例時,可以藉助jenkins之類的CI/CD工具,也可以使用定時任務crontab,作為測試開發工程師,我們可能沒有許可權去操作伺服器,那麼我們就只能使用django-crontab,在指定時間(迴圈執行)測試用例

相關文章