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读写文件操作示例程序
Dec 02 Python
Python解决鸡兔同笼问题的方法
Dec 20 Python
python通过pil为png图片填充上背景颜色的方法
Mar 17 Python
用 Python 爬了爬自己的微信朋友(实例讲解)
Aug 25 Python
使用Python的package机制如何简化utils包设计详解
Dec 11 Python
Python编程求解二叉树中和为某一值的路径代码示例
Jan 04 Python
Mac在python3环境下安装virtualwrapper遇到的问题及解决方法
Jul 09 Python
Python3 itchat实现微信定时发送群消息的实例代码
Jul 12 Python
解决tensorflow由于未初始化变量而导致的错误问题
Jan 06 Python
如何在python中判断变量的类型
Jul 29 Python
学点简单的Django之第一个Django程序的实现
Feb 24 Python
Python爬虫实战之爬取京东商品数据并实实现数据可视化
Jun 07 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中文件读、写、删的操作(PHP中对文件和目录操作)
2012/03/06 PHP
php错误、异常处理机制(补充)
2012/05/07 PHP
php指定函数参数默认值示例代码
2013/12/04 PHP
PHP循环遍历数组的3种方法list()、each()和while总结
2014/11/19 PHP
php使用GD实现颜色渐变实例
2015/06/02 PHP
简单谈谈favicon
2015/06/10 PHP
js no-repeat写法 背景不重复
2009/03/18 Javascript
jQuery 前的按键判断代码
2010/03/19 Javascript
node在两个div之间移动,用ztree实现
2013/03/06 Javascript
javascript打印大全(打印页面设置/打印预览代码)
2013/03/29 Javascript
Jquery实现弹出层分享微博插件具备动画效果
2013/04/03 Javascript
JS动态增加删除UL节点LI及相关内容示例
2014/05/21 Javascript
JS实现兼容性好,自动置顶的淘宝悬浮工具栏效果
2015/09/18 Javascript
谈谈js中的prototype及prototype属性解释和常用方法
2015/11/25 Javascript
javascript入门之数组[新手必看]
2016/11/21 Javascript
vue-router实现webApp切换页面动画效果代码
2017/05/25 Javascript
vue自定义指令directive实例详解
2018/01/17 Javascript
使用node.JS中的url模块解析URL信息
2020/02/06 Javascript
javascript实现移动端上传图片功能
2020/08/18 Javascript
在Python的循环体中使用else语句的方法
2015/03/30 Python
python模拟事件触发机制详解
2018/01/19 Python
Zookeeper接口kazoo实例解析
2018/01/22 Python
python使用生成器实现可迭代对象
2018/03/20 Python
Python第三方Window模块文件的几种安装方法
2018/11/22 Python
用openCV和Python 实现图片对比,并标识出不同点的方式
2019/12/19 Python
浅谈如何使用python抓取网页中的动态数据实现
2020/08/17 Python
pymongo insert_many 批量插入的实例
2020/12/05 Python
python excel多行合并的方法
2020/12/09 Python
Lancer Skincare官方网站:抗衰老皮肤护理
2020/11/20 全球购物
大学生个人推荐信范文
2013/11/25 职场文书
水利学院求职自荐书
2014/02/01 职场文书
2015年全民国防教育日活动总结
2015/03/23 职场文书
求职自荐信范文(优秀篇)
2015/03/27 职场文书
学校社团活动总结
2015/05/07 职场文书
同步小康驻村工作简报
2015/07/20 职场文书
原型和原型链 prototype和proto的区别详情
2021/11/02 Javascript