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完全新手教程
Feb 08 Python
python搭建微信公众平台
Feb 09 Python
Python实现获取照片拍摄日期并重命名的方法
Sep 30 Python
python距离测量的方法
Mar 06 Python
使用Scrapy爬取动态数据
Oct 21 Python
python实现大转盘抽奖效果
Jan 22 Python
python+pyqt5实现KFC点餐收银系统
Jan 24 Python
pyenv与virtualenv安装实现python多版本多项目管理
Aug 17 Python
Python远程开发环境部署与调试过程图解
Dec 09 Python
Django bulk_create()、update()与数据库事务的效率对比分析
May 15 Python
Python扫描端口的实现
Jan 25 Python
教你用python实现12306余票查询
Jun 30 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
PHP实现PDO的mysql数据库操作类
2014/12/12 PHP
什么是OneThink oneThink后台添加插件步骤
2016/04/13 PHP
php生成txt文件实例代码介绍
2016/04/28 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
javascript 常用关键字列表集合
2007/12/04 Javascript
js 加载并解析XML字符串的代码
2009/12/13 Javascript
js给页面加style无效果的解决方法
2014/01/20 Javascript
简单js代码实现selece二级联动(推荐)
2014/02/18 Javascript
关于jQuery判断元素是否存在的问题示例探讨
2014/07/21 Javascript
JS中自定义定时器让它在某一时刻执行
2014/09/02 Javascript
深入浅析JavaScript面向对象和原型函数
2016/02/06 Javascript
JavaScript代码里的判断小结
2016/08/22 Javascript
通过修改360抢票的刷新频率和突破8车次限制实现方法
2017/01/04 Javascript
jQuery常见面试题之DOM操作详析
2017/07/05 jQuery
基于easyui checkbox 的一些操作处理方法
2017/07/10 Javascript
vue template中slot-scope/scope的使用方法
2018/09/06 Javascript
教你如何编写Vue.js的单元测试的方法
2018/10/17 Javascript
vue 动态添加的路由页面刷新时失效的原因及解决方案
2021/02/26 Vue.js
用Python编写一个每天都在系统下新建一个文件夹的脚本
2015/05/04 Python
python使用paramiko实现远程拷贝文件的方法
2016/04/18 Python
pygame游戏之旅 游戏中添加显示文字
2018/11/20 Python
python Event事件、进程池与线程池、协程解析
2019/10/25 Python
基于python-pptx库中文文档及使用详解
2020/02/14 Python
Python文件名匹配与文件复制的实现
2020/12/11 Python
python 利用matplotlib在3D空间绘制二次抛物面的案例
2021/02/06 Python
HTML5里的placeholder属性使用实例和美化显示效果的方法
2014/04/23 HTML / CSS
Web前端页面跳转并取到值
2017/04/24 HTML / CSS
新媒传信软件测试面试题
2013/02/24 面试题
优秀学生获奖感言
2014/02/15 职场文书
普通党员四风问题对照检查材料
2014/09/27 职场文书
企业年检委托书范本
2014/10/14 职场文书
2014年行政后勤工作总结
2014/12/06 职场文书
先进个人材料怎么写
2014/12/30 职场文书
2015年学校德育工作总结
2015/04/22 职场文书
2015年药店店长工作总结
2015/04/29 职场文书
JavaScript实例 ODO List分析
2022/01/22 Javascript