05月13, 2016

Django框架中使用django-crontab实现定时任务

使用定时任务,可以实现很多功能,比如更新数据库,发送邮件等,一般都是使用系统自带的定时任务实现,但是使用Django框架时可以通过django-crontab插件来实现定时任务,本文总结了django-crontab的使用步骤 ,官方也有简单的介绍,想看官方介绍的请移步:django-crontab的使用,接下来就是本文总结的内容:

1、安装django-crontab插件

I、安装:

Django版本1.8+,使用如下命令:

pip install django-crontab

Django版本1.8-,使用如下命令:

pip install django-crontab==0.6.0

II、在项目中引用:

修改setting.py文件,在INSTALLED_APPS中引入django_crontab

INSTALLED_APPS = [
    'django_crontab',
    ...
]

2、实现定时任务

本文举例要实现以下定时功能:每分钟往指定的txt文本中追加写入文本Hello,World!

示例的APP名字是myappProject路径是/data/www/myproject,下面介绍两种不同的实现方法:

I、在app目录中编写脚本:

①、在/data/www/myproject/myapp目录创建mycron.py文件

②、在mycron.py文件中写入以下内容:

    def writefile():
        with open('/data/www/myproject/myapp/mycron.txt', 'a+') as f:
            f.write('Hello,World!')

③、设定计划任务:

setting.py中加入以下内容

CRONJOBS = [
    ('*/1 * * * *', 'myapp.mycron.writefile')
]

说明:前面的时间写法与常规定时任务中时间的写法相同,这里不做细说,不知道的可自行查询,最主要的是myapp.mycron.writefile代表的意义:

  • myapp指的是 APP名字
  • mycron指的是定时任务脚本的文件名字
  • writefile指的是定时任务脚本的方法名字

④、添加计划任务:

python manage.py crontab add

这样计划任务就添加完成了,稍等一分钟你就可以在/data/www/myproject/myapp/mycron.txt文件中看到Hello,World!

注:个人觉得这种在APP目录中写定时脚本的方法仅适用于简单的,数据定向执行的一些任务,比如说文本写入,简单的查询写入等,接下来要介绍的写法是比较适合复杂数据操作的方法:

II、在commands目录编写脚本:

详细的使用方法,可以参考django如何使用自定义management-commands

①、在/data/www/myproject/myapp/management/commands目录创建mycron.py文件

如果没有/management/commands目录,则手动创建目录

注意:/data/www/myproject/myapp/management/__init__.py/data/www/myproject/myapp/management/commands/__init__.py需要手动创建,这两个文件一定要存在 ,最终的目录结构大概如下:

myapp/
    __init__.py
    models.py
    management/
        __init__.py
        commands/
            __init__.py
            _private.py
            mycron.py
    tests.py
    views.py

说明:Django为项目(Project)中每一个应用(APP)下的management/commands目录中名字没有以下划线开始的Python模块都注册了一个manage.py命令,例如: 在上述目录结构中,_private.py将不可以作为一个管理命令使用,但是mycron.py可以作为一个管理命令使用,mycron.py模块只有一个要求:它必须定义一个Command类并扩展自Basecommand或其子类,下面开始编写本文示例需要的脚本

②、在/data/www/myproject/myapp/management/commands/mycron.py中写入以下内容:

# -*- coding: utf-8 -*-
from django.core.management.base import BaseCommand, CommandError

class Command(BaseCommand):
    help = 'mycron command'
    # 必须有且必须实现的方法:handle
    def handle(self, *args, **options):
        try:
            with open('/data/www/myproject/myapp/mycroncommand.txt', 'a+') as f:
                f.write('Hello, world!')
        except:
                raise CommandError('can not write file')
        self.stdout.write('Successfully write file')

这样就创建了新的自定义命令mycron,可以使用python manage.py mycron调用,实验一下:

进入Project目录:

cd /data/www/myproject

执行如下命令:

python manage.py mycron

屏幕上会输出内容:Successfully write file

查看文件内容:

cat /data/www/myproject/myapp/mycroncommand.txt

会看到内容:

Hello, world!

证明mycron.py文件已经被注册成为mycron命令了,接下来创建计划任务

③、设定计划任务:

setting.py中加入以下内容

CRONJOBS = [
    ('*/1 * * * *', 'django.core.management.call_command', ['mycron'],{},'>> /data/log/myproject/mycroncommand.log')
]

格式说明:

  • 参数1:定时 例如*/1 * * * *表示每分钟执行
  • 参数2:方法的Python模块路径,Python模块命令统一使用:django.core.management.call_command
  • 参数3:方法的位置参数列表(默认值:[]),需要填写所需执行的命令,例如在第三步生成的自定义命令mycron
  • 参数4:方法的关键字参数的dict(默认值:{})
  • 参数5:执行log存放位置(即重定向到文件,默认:'')

④、添加计划任务:

python manage.py crontab add

这样计划任务就添加完成了,稍等一分钟你就可以在/data/www/myproject/myapp/mycroncommand.txt文件中看到新增了文本Hello,World!,也可以在/data/log/myproject/mycroncommand.log文件中看到Successfully write file内容

3、django-crontab常用命令

  • 添加定时任务:python manage.py crontab add
  • 查看正在运行的任务:python manage.py crontab show
  • 删除所有任务使:python manage.py crontab remove
  • 如果任务有更新,需要使用python manage.py crontab add来重新生成任务
  • 如果要去掉某一个任务,需要先执行python manage.py crontab remove删除所有任务,然后修改CRONJOBS的设置,最后再执行python manage.py crontab add,否则会报错

以上就是使用django-crontab实现定时任务的两种方法,有任何问题可以在文章下方留言。

本文链接:https://www.shaobin.wang/post/19.html

Comments