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数据结构树和二叉树简介
Apr 29 Python
初学Python函数的笔记整理
Apr 07 Python
Python中方法链的使用方法
Feb 23 Python
python实现list元素按关键字相加减的方法示例
Jun 09 Python
python使用Matplotlib画饼图
Sep 25 Python
python中使用while循环的实例
Aug 05 Python
详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)
Nov 11 Python
python与mysql数据库交互的实现
Jan 06 Python
django admin 根据choice字段选择的不同来显示不同的页面方式
May 13 Python
python利用线程实现多任务
Sep 18 Python
Python classmethod装饰器原理及用法解析
Oct 17 Python
python实现企业微信定时发送文本消息的实例代码
Nov 25 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(二)
2012/03/21 PHP
学习php设计模式 php实现备忘录模式(Memento)
2015/12/09 PHP
PHP封装的page分页类定义与用法完整示例
2018/12/24 PHP
PHP的mysqli_sqlstate()函数讲解
2019/01/23 PHP
通用于ie和firefox的函数 GetCurrentStyle (obj, prop)
2006/12/27 Javascript
用javascript实现分割提取页面所需内容
2007/05/09 Javascript
ajax与302响应代码测试
2013/10/23 Javascript
Node.js实现JS文件合并小工具
2016/02/02 Javascript
通过BootStrap实现轮播图的实际应用
2016/09/26 Javascript
Javascript将字符串日期格式化为yyyy-mm-dd的方法
2016/10/27 Javascript
nodejs的压缩文件模块archiver用法示例
2017/01/18 NodeJs
JavaScript使用atan2来绘制箭头和曲线的实例
2017/09/14 Javascript
从零开始搭建一个react项目开发
2018/02/09 Javascript
js技巧之十几行的代码实现vue.watch代码
2018/06/09 Javascript
Vue组件通信的几种实现方法
2019/04/25 Javascript
vue 微信扫码登录(自定义样式)
2020/01/06 Javascript
[41:54]2018DOTA2亚洲邀请赛 4.1 小组赛A组加赛 TNC vs Liquid
2018/04/03 DOTA
[51:30]OG vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.26
2018/08/30 DOTA
通过数据库向Django模型添加字段的示例
2015/07/21 Python
在windows下Python打印彩色字体的方法
2018/05/15 Python
Python利用递归实现文件的复制方法
2018/10/27 Python
使用Django实现把两个模型类的数据聚合在一起
2020/03/28 Python
python map比for循环快在哪
2020/09/21 Python
详解anaconda安装步骤
2020/11/23 Python
24个canvas基础知识小结
2014/12/17 HTML / CSS
C#中的验证控件有几种
2014/03/08 面试题
土木工程应届生求职信
2013/10/31 职场文书
如何撰写岗位职责
2014/02/01 职场文书
反腐倡廉警示教育活动总结
2014/05/05 职场文书
九寨沟导游词
2015/02/02 职场文书
2015年科协工作总结
2015/05/19 职场文书
预备党员群众意见
2015/06/01 职场文书
七年级作文之雪景
2019/11/18 职场文书
如何用 Python 子进程关闭 Excel 自动化中的弹窗
2021/05/07 Python
如何用PHP实现多线程编程
2021/05/26 PHP
TypeScript 内置高级类型编程示例
2022/09/23 Javascript