django 定時任務 django-crontab 的使用

1烘挫、前言

在做 django 開發(fā)需求時诀艰,多多少少都會遇到需要定時任務的功能,比如定時執(zhí)行任務饮六,檢查訂單之類的其垄。可能是一段時間卤橄,比如每隔 10分鐘執(zhí)行一次绿满,也可能是定點時間,比如 14:00 執(zhí)行窟扑,也可能是長時間喇颁,比如每周幾,每個月的哪一天等嚎货。查看了一下相關(guān)資料橘霎, django 定時任務 django-crontab 庫比較多教程和資料,雖然 star 數(shù)才五百殖属,但是 API 接口比較簡單姐叁,接入也很方便,功能也很全面,當然外潜,也存在一此無法解決的問題原环,使用時需要注意的。

2处窥、使用教程

1.安裝:

pip install django-crontab

2.添加配置到 settings.py INSTALLED_APPS

INSTALLED_APPS = (
    'django_crontab',
    ...
)

3.編寫定時函數(shù):

定時任務可以分成兩種嘱吗,一種是執(zhí)行自定義的mange.py的命令,另一種是執(zhí)行自定義函數(shù)滔驾。

在django的app中新建一個myapp/cron.py文件谒麦,把需要定時執(zhí)行的代碼放進去

示例:

def my_scheduled_job():
  pass

4.在 settings.py 中增加CRONJOBS配置

CRONJOBS = [
    ('*/5 * * * *', 'myapp.cron.my_scheduled_job')
]

也可以定義一些關(guān)鍵字參數(shù),有2種格式:

格式1:

  • 要求:cron計時通常格式(有關(guān)更多示例哆致,請參閱 Wikipediacrontab.guru
  • 要求:python模塊路徑下待執(zhí)行定時任務
  • 可選:特定于定時任務的后綴(例如弄匕,將 out/err 重定向到文件,默認值為'')

示例:

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

]

注意: >> 表示追加寫入沽瞭,> 表示覆蓋寫入。

格式2:

  • 要求:cron計時通常格式
  • 要求:python模塊路徑下待執(zhí)行定時任務
  • 可選:方法的位置參數(shù)列表(默認值:[])
  • 可選:方法的關(guān)鍵字參數(shù)的dict(默認值:{})
  • 可選:特定于定時任務的后綴(例如剩瓶,將 out/err 重定向到文件驹溃,默認值為'')

示例:

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

對于熟悉 Linux 中定時任務crontab 的同學可能對上面第一個參數(shù)的語法很親切。上面表示每隔1分鐘執(zhí)行一次代碼延曙。

Linux 中的定時任務crontab的語法如下:

*  *  *  *  * command
分鐘(0-59) 小時(0-23) 每個月的哪一天(1-31) 月份(1-12) 周幾(0-6) shell腳本或者命令

有幾個特殊的符號:

* 代表所有的取值范圍的數(shù)字
/ 代表每的意思豌鹤,*/5就是每5個單位
- 代表從某個數(shù)字到某個數(shù)字
, 分開幾個離散的數(shù)字

示例:

每兩個小時    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點執(zhí)行, 并將信息追加到test.log中
0 */2 * * * commands # 每隔2小時執(zhí)行一次

有興趣的小伙伴可以深入研究下 Linux 的crontab定時任務枝缔。如果不了解和不熟悉可以想看: cron語法格式學習

5.添加并啟動定時任務

#添加并啟動定時任務
python manage.py crontab add

其它命令:

#顯示當前的定時任務
python manage.py crontab show

#刪除所有定時任務
python manage.py crontab remove

一些問題

如果配置成這樣:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

CRONJOBS = [
('0 7 * * 1-5', 'api.cron.email_to_late_docs', '>> {}'.format(BASE_DIR + '/logs/log_{:%d_%m_%Y}.log'.format(time.now()))),
('0 7 * * 1-5', 'api.cron.email_ten_days_before', '>> {}'.format(BASE_DIR + 'logs/log_{:%d_%m_%Y}.log'.format(time.now())))
]

上述代碼的目的是布疙,希望對任務的輸出和錯誤日志,進行 log_ddmmYY 格式進行文件每天分開保存愿卸。

但是這個任務灵临,在第二天時,就不會在執(zhí)行啦E枯儒溉!

因為,CRONJOBS 生成任務時发钝,會生成對應的哈希值(hashes)顿涣,標識每個任務。所以酝豪,當文件名變更時涛碑,CRONJOBS 中的值每天都在變化,導致不同的定時任務哈希值(hashes)孵淘。

針對這種情況蒲障,解決方法是,日志文件名稱固定,然后創(chuàng)建一個任務晌涕,用來每天把日志文件重命名(move)成想要的格式名稱滋捶,這樣就可以啦!

總結(jié)

通過這個需求余黎,可以看到很多知識點其實是串聯(lián)起來的重窟,從pythondjangoLinuxcrontab,所以惧财,學習無止境巡扇,知識學習只會越來越多,如果你提前掌握了某些知識垮衷,那么學習新(舊)知識的成本就會降低很多厅翔,或者理解成本,比如你學習了 Linux搀突, 了解過 cron 刀闷,那么對于學習這個 django 的定時任務會輕松很多!永遠不要認為有些知識你永遠用不上仰迁,所以現(xiàn)在就不學甸昏,可能現(xiàn)在的永遠距離已經(jīng)很短啦!加油~

參考


  • 如有疑問徐许,歡迎在評論區(qū)一起討論施蜜!
  • 如有不正確的地方,歡迎指導雌隅!


注:本文首發(fā)于 iHTCboy's blog翻默,如若轉(zhuǎn)載,請注來源

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末恰起,一起剝皮案震驚了整個濱河市修械,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌村缸,老刑警劉巖祠肥,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異梯皿,居然都是意外死亡仇箱,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門东羹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來剂桥,“玉大人,你說我怎么就攤上這事属提∪ǘ海” “怎么了美尸?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長斟薇。 經(jīng)常有香客問我师坎,道長,這世上最難降的妖魔是什么堪滨? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任胯陋,我火速辦了婚禮,結(jié)果婚禮上袱箱,老公的妹妹穿的比我還像新娘遏乔。我一直安慰自己,他們只是感情好发笔,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布盟萨。 她就那樣靜靜地躺著,像睡著了一般了讨。 火紅的嫁衣襯著肌膚如雪捻激。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天前计,我揣著相機與錄音铺罢,去河邊找鬼。 笑死残炮,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的缩滨。 我是一名探鬼主播势就,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼脉漏!你這毒婦竟也來了苞冯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤侧巨,失蹤者是張志新(化名)和其女友劉穎舅锄,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體司忱,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡皇忿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了坦仍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鳍烁。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖繁扎,靈堂內(nèi)的尸體忽然破棺而出幔荒,到底是詐尸還是另有隱情糊闽,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布爹梁,位于F島的核電站右犹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏姚垃。R本人自食惡果不足惜念链,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望莉炉。 院中可真熱鬧钓账,春花似錦、人聲如沸絮宁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绍昂。三九已至啦粹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間窘游,已是汗流浹背唠椭。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留忍饰,地道東北人贪嫂。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像艾蓝,于是被迫代替她去往敵國和親力崇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355