django定期执行任务(实例讲解)


Posted in Python onNovember 03, 2017

要在django项目中定期执行任务,比如每天一定的时间点抓取数据,刷新数据库等,可以参考stackoverflow的方法,先编写一个manage.py命令,然后使用crontab来定时执行这个命令。

定制manage.py命令

app可以使用manage.py注册自己的命令,比如要在polls这个app中定制一个closepoll命令,要先向polls文件夹中添加一个management/commands的目录:

polls/
  __init__.py 
  models.py 
  management/
    __init__.py 
    commands/
      __init__.py 
      _private.py 
      closepoll.py 
  tests.py 
  views.py

这样,commands目录下每一个不以"_"开头的py文件都被注册为一个manage.py命令。

python 2版本中注意management和commands目录下都要包含一个__init__.py文件。

closepoll.py文件中必须定义一个继承自BaseCommand的类Command。

from django.core.management.base import BaseCommand, CommandError 
from polls.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) 
 
  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) 
 
      poll.opened = False
      poll.save() 
 
      self.stdout.write(self.style.SUCCESS('Successfully closed poll "%s"' % poll_id))

在django1.8之前,manage.py命令的命令行解析是基于optparse库的,其中位置参数会被传给*args,而可选参数传给**options。1.8之后,命令行解析基于argparse库,参数都是传给**options的。

closepoll.py文件中添加了名为poll_id的位置参数,数目为一个或者更多,类型为整数:

def add_arguments(self, parser): 
parser.add_argument('poll_id', nargs='+', type=int)

closepoll命令就可以这样使用了:

python manage.py closepoll <poll_id>

self.stdout和self.stderr可以在控制台中显示你想要显示的信息。

可以添加可选参数:

class Command(BaseCommand): 
  def add_arguments(self, parser): 
    # Positional arguments 
    parser.add_argument('poll_id', nargs='+', type=int) 
 
    # Named (optional) arguments 
    parser.add_argument('--delete', 
      action='store_true', 
      dest='delete', 
      default=False, 
      help='Delete poll instead of closing it') 
 
  def handle(self, *args, **options): 
    # ... 
    if options['delete']: 
      poll.delete()

添加一个名为--delete值为True的可选参数。

执行python manage.py closepoll 1 2 3 --delete时,将id为1,2,3的poll删除。

执行python manage.py closepoll 1 2 3 时,--delete取值为默认值False。

使用crontab定时执行manage.py命令

使用crontab -e命令编辑cron,窗口会有提示:

# m h dom mon dow  command

在某月(mon)的某天(dom)或者星期几(dow)的几点(h,24小时制)几分(m)执行某个命令(command),*表示任意时间。

* */2 * * * python manage.py closepoll <poll_id>

这样表示每两个小时执行一次closepoll命令,为了防止manage.py文件找不到,可以写上manage.py文件的真实地址。

保存后重启cron即可:

sudo service cron restart

以上这篇django定期执行任务(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中字典和JSON互转操作实例
Jan 19 Python
Windows下Eclipse+PyDev配置Python+PyQt4开发环境
May 17 Python
常见python正则用法的简单实例
Jun 21 Python
Python实现对一个函数应用多个装饰器的方法示例
Feb 09 Python
python中单例常用的几种实现方法总结
Oct 13 Python
Python 最大概率法进行汉语切分的方法
Dec 14 Python
Python获取好友地区分布及好友性别分布情况代码详解
Jul 10 Python
python随机数分布random均匀分布实例
Nov 27 Python
Python的PIL库中getpixel方法的使用
Apr 09 Python
Python实现将元组中的元素作为参数传入函数的操作
Jun 05 Python
Python logging模块handlers用法详解
Aug 14 Python
Django视图类型总结
Feb 17 Python
python嵌套字典比较值与取值的实现示例
Nov 03 #Python
基于Python os模块常用命令介绍
Nov 03 #Python
django实现同一个ip十分钟内只能注册一次的实例
Nov 03 #Python
Python实现1-9数组形成的结果为100的所有运算式的示例
Nov 03 #Python
python使用PyCharm进行远程开发和调试
Nov 02 #Python
python中文分词教程之前向最大正向匹配算法详解
Nov 02 #Python
详解Python里使用正则表达式的ASCII模式
Nov 02 #Python
You might like
我的论坛源代码(十)
2006/10/09 PHP
CodeIgniter框架过滤HTML危险代码
2014/06/12 PHP
PHP对称加密算法(DES/AES)类的实现代码
2017/11/14 PHP
javascript 获取表单file全路径
2009/12/31 Javascript
jQuery中绑定事件的命名空间详解
2011/04/05 Javascript
jquery创建一个新的节点对象(自定义结构/内容)的好方法
2013/01/21 Javascript
JQuery入门——用映射方式绑定不同事件应用示例
2013/02/05 Javascript
JavaScript对内存分配及管理机制详细解析
2013/11/11 Javascript
基于NodeJS的前后端分离的思考与实践(二)模版探索
2014/09/26 NodeJs
深入理解JavaScript系列(40):设计模式之组合模式详解
2015/03/04 Javascript
jQuery基于ajax方式实现用户名存在性检查功能示例
2017/02/10 Javascript
node.js中实现kindEditor图片上传功能的方法教程
2017/04/26 Javascript
node中使用es5/6以及支持性与性能对比
2017/08/11 Javascript
[00:05]ChinaJoy现场 DOTA2玩家高呼“CN DOTA BEST DOTA”
2019/08/04 DOTA
Python使用PyCrypto实现AES加密功能示例
2017/05/22 Python
Python 模拟登陆的两种实现方法
2017/08/10 Python
python print 按逗号或空格分隔的方法
2018/05/02 Python
numpy.linspace 生成等差数组的方法
2018/07/02 Python
python实现爬取图书封面
2018/07/05 Python
python多进程使用及线程池的使用方法代码详解
2018/10/24 Python
Windows 安装 Anaconda3+PyCharm的方法步骤
2019/06/13 Python
python利用tkinter实现屏保
2019/07/30 Python
Django获取该数据的上一条和下一条方法
2019/08/12 Python
Django框架配置mysql数据库实现过程
2020/04/22 Python
python+selenium+chrome实现淘宝购物车秒杀自动结算
2021/01/07 Python
HTML5标签小集
2011/08/02 HTML / CSS
Adobe Html5 Extension开发初体验图文教程
2017/11/14 HTML / CSS
碧欧泉美国官网:Biotherm美国
2016/08/31 全球购物
英国百年闻名的优质健康产品连锁店:Holland & Barrett
2019/12/19 全球购物
普师专业个人自荐信范文
2013/11/26 职场文书
函授毕业个人自我评价
2014/02/20 职场文书
心得体会的写法
2014/09/05 职场文书
优秀共青团员事迹材料
2014/12/25 职场文书
导游词之重庆渣滓洞
2020/01/08 职场文书
压缩Redis里的字符串大对象操作
2021/06/23 Redis
python 使用pandas读取csv文件的方法
2022/12/24 Python