【张亚楠】django-crontab实现Django定时任务

  • A+
所属分类:SEO好文章
本文信息本文由方法SEO顾问发表于2015-11-1814:36:01,共 2747 字,转载请注明:【张亚楠】django-crontab实现Django定时任务_【方法SEO顾问】

1. 前言

为了做一些报表,最近需要每日从爱站上抓取竞争对手的百度流量和移动流量,从我能实现的技术来看,大致有三种实现形式:

  1. 火车头定时抓取
  2. python+crontab定时抓取,保存在txt或cav或数据库中;
  3. django定时任务,用admin系统或模板系统展现。

第一种不熟悉,还要摸索;第二种数据展现还要自己写,如果用数据库,还要用很原始的连接方式,至少用了django之后是这样;第三种优点是可以用admin系统或模板系统来,缺点是定时任务不熟悉。但考虑到打算深入学习django,于是决定用第三种方式来实现。

2. Django定时任务

Django的定时任务基本也有三种实现形式:

  1. django-celery
  2. Django的command+crontab
  3. 一些第三方库,如django-crontab

首先,看了下django-celery的官方教程,celery还是比较庞大的,而且教程比较复杂,没耐心的我就先行跳过了;

其次,又看了Django关于command的官方文档,实现了command+crontab的形式。但因为是在virtualenv下部署,一直无法实现。即便crontab中已经设置了先进入virtualenv再运行command仍然失败了(crontab中语法是source /home/../bin/activate && python /home/.../manage.py aizhan_visits)。

最后,选择了第三方库django-crontab,竟意外的实现了Django在virtualenv下的的定时任务。。

3. django-crontab实现Django在virtualenv的定时任务

3.1 django-crontab安装

  • django-crontab安装:pip install django-crontab

  • django-crontab加入:只需要将django-crontab加入到settings.py的INSTALLED_APPS即可。如下代码:

    INSTALLED_APPS = ( 'django-crontab', ... ) 

3.2 django-crontab配置

django-crontab可以定时运行自定义命令和函数两种方式,因为之前尝试用command+crontab时已经实现了自定义command,所以自然而然使用了自定义命令这种形式。

3.2.1 django-crontab定时运行命令

我先参考Django官方文档自定义了一个命令aizhan_5domain_visits,专门用于抓取爱站流量,并将结果保存在sqlite3数据库中(具体步骤在本文中不赘述了)。

其次,我在settings.py中加入了django-crontab的命令:

CRONJOBS = [ ('47 11 * * *', 'django.core.management.call_command', ['aizhan_5domain_visits']), ] 

意思就是每天11点47分运行aizhan_5domain_visits这个命令。接下来就剩最后一步任务加载了。

3.2.2 django-crontab定时运行函数

django-crontab也可以定时运行函数,只是在CRONJOBS配置时有差别。CRONJOBS关于函数的配置如下:

CRONJOBS = ( # 初级模式 ('*/5 * * * *', 'myproject.myapp.cron.my_scheduled_job'), # 中级模式 ('0   0 1 * *', 'myproject.myapp.cron.my_scheduled_job', '> /tmp/last_scheduled_job.log'), #高级模式 ('0   0 * * 0', 'django.core.management.call_command', ['dumpdata', 'auth'], {'indent': 4}, '> /home/john/backups/last_sunday_auth_backup.json'), ) 

分析结果:

  • 初级模式很直观,意思就是每五分钟执行一次my_scheduled_job这个程序;
  • 中级模式有个后缀,意思是将程序my_scheduled_job的结果输出到文件/tmp/last_scheduled_job.log中;
  • 高级模式加入了参数,其中['dumpdata', 'auth']和{'indent': 4}都是参数,只是[]中的参数是按照顺序代入,而{}中的参数指定了变量名称,最后一个也是输出结果的后缀。

3.3 django-crontab任务加载

django-crontab任务加载比较简单,只需要运行python manage.py crontab add即可。如果你运行crontab -e可以看到crontab中多了一行:

47 11 * * *  /home/aizhan/bin/python /home/aizhan/aizhan/manage.py crontab run c27d1050fb7f87225bcff587ef5a35a3   # django-cronjobs for aizhan

这是django-crontab自动生成的。

  • 如果要移除所有的任务,则运行python manage.py crontab remove;
  • 当你修改了任务,需要再次运行python manage.py crontab add。

4. 实现效果

最后通过配置admin.py,在admin后台实现了基本的数据展现,效果图如下:

参考文档

  • django-celery的官方文档:http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html
  • django-crontab的官方文档:https://github.com/kraiz/django-crontab
  • Django官方文档中关于自定义command的部分:https://docs.djangoproject.com/en/1.6/howto/custom-management-commands/
  • 关于crontab任务的说明:http://www.flatws.cn/article/program/shell/2011-02-23/14037.html

后记

  1. 关于题图。转自Sticky Notes的Savage Chickens系列,作者是Doug Savage,本图名字是Time After Time Cartoon;
  2. 关于感受。长时间不写,感觉思路不清晰,写出来的话也毫无生气。

文章来源:张亚楠博客http://www.zhidaow.com/post/django-crontab

  • 版权声明:除非注明,本博客均为北京SEO方法的原创文章,转载或引用请以超链接形式标明本文地址,否则会在SEO圈内公开此种不尊重版权的行为,谢谢合作!本文地址:https://seofangfa.com/seo-articles/django-crontab.html
  • 转载请注明:【张亚楠】django-crontab实现Django定时任务_ 【方法SEO顾问】

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:1   其中:访客  0   博主  0   引用   1

    来自外部的引用: 1

    • 【张亚楠】django-crontab实现Django定时任务 – 人也欢博客