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聊天程序实例代码分享
Nov 18 Python
跟老齐学Python之dict()的操作方法
Sep 24 Python
Python文件和流(实例讲解)
Sep 12 Python
python实现分页效果
Oct 25 Python
Python-while 计算100以内奇数和的方法
Jun 11 Python
Python API 自动化实战详解(纯代码)
Jun 11 Python
Django工程的分层结构详解
Jul 18 Python
python+mysql实现个人论文管理系统
Oct 25 Python
详解Python的三种拷贝方式
Feb 11 Python
Python Tornado批量上传图片并显示功能
Mar 26 Python
使用Python构造hive insert语句说明
Jun 06 Python
浅谈pytorch中的dropout的概率p
May 27 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中获取指定IP的物理地址的代码(正则表达式)
2011/06/23 PHP
单一index.php实现PHP任意层级文件夹遍历(Zjmainstay原创)
2012/07/31 PHP
基于php-fpm的配置详解
2013/06/03 PHP
PHP的PDO操作简单示例
2016/03/30 PHP
PHP实现的Redis多库选择功能单例类
2017/07/27 PHP
表单(FORM)的一些实用效果代码
2007/03/25 Javascript
工作需要写的一个js拖拽组件
2011/07/28 Javascript
当鼠标滑过文本框自动选中输入框内容的JS代码分享
2013/11/26 Javascript
动态的绑定事件addEventListener方法的使用
2014/01/24 Javascript
jQuery 处理页面的事件详解
2015/01/20 Javascript
Jquery实现动态切换图片的方法
2015/05/18 Javascript
jQuery超酷平面式时钟效果代码分享
2020/03/30 Javascript
jQuery+Ajax实现无刷新分页
2015/10/30 Javascript
微信小程序加载更多 点击查看更多
2016/11/29 Javascript
老生常谈jquery id选择器和class选择器的区别
2017/02/12 Javascript
微信小程序之绑定点击事件实例详解
2017/07/07 Javascript
浅谈Node异步编程的机制
2017/10/18 Javascript
微信小程序使用wxParse解析html的方法教程
2018/07/06 Javascript
详解javascript 变量提升(Hoisting)
2019/03/12 Javascript
webpack 代码分离优化快速指北
2019/05/18 Javascript
Python中内建函数的简单用法说明
2016/05/05 Python
使用Django和Python创建Json response的方法
2018/03/26 Python
pandas实现选取特定索引的行
2018/04/20 Python
详解Python下载图片并保存本地的两种方式
2019/05/15 Python
PyTorch中的padding(边缘填充)操作方式
2020/01/03 Python
python和go语言的区别是什么
2020/07/20 Python
Python面向对象实现方法总结
2020/08/12 Python
使用CSS3的背景渐变Text Gradient 创建文字颜色渐变
2014/08/19 HTML / CSS
详解移动端Html5页面中1px边框的几种解决方法
2018/07/24 HTML / CSS
文员个人求职自荐信
2013/09/21 职场文书
什么样的创业计划书可行性高?
2014/02/01 职场文书
四风问题党员个人整改措施
2014/10/27 职场文书
党小组鉴定意见
2015/06/02 职场文书
入团介绍人意见范文
2015/06/04 职场文书
Django REST framework 限流功能的使用
2021/06/24 Python
Android Rxjava3 使用场景详解
2022/04/07 Java/Android