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 相关文章推荐
Web服务器框架 Tornado简介
Jul 16 Python
Python 多线程实例详解
Mar 25 Python
python+selenium实现京东自动登录及秒杀功能
Nov 18 Python
python实现自动网页截图并裁剪图片
Jul 30 Python
对python3中pathlib库的Path类的使用详解
Oct 14 Python
Python设计模式之外观模式实例详解
Jan 17 Python
图文详解python安装Scrapy框架步骤
May 20 Python
在python中计算ssim的方法(与Matlab结果一致)
Dec 19 Python
PyCharm 2020 激活到 2100 年的教程
Mar 25 Python
解决Python3.7.0 SSL低版本导致Pip无法使用问题
Sep 03 Python
如何在vscode中安装python库的方法步骤
Jan 06 Python
Python 图片添加美颜效果
Apr 28 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
解析如何修改phpmyadmin中的默认登陆超时时间
2013/06/25 PHP
解密ThinkPHP3.1.2版本之模块和操作映射
2014/06/19 PHP
phalcon model在插入或更新时会自动验证非空字段的解决办法
2016/12/29 PHP
CakePHP框架Session设置方法分析
2017/02/23 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
2017/07/26 PHP
PHP实现文字写入图片功能
2019/02/18 PHP
不要在cookie中使用特殊字符的原因分析
2010/07/13 Javascript
Javascript中的return作用及javascript return关键字用法详解
2015/11/05 Javascript
快速掌握Node.js环境的安装与运行方法
2016/02/16 Javascript
Js+Ajax,Get和Post在使用上的区别小结
2016/06/08 Javascript
Bootstrap table表格简单操作
2017/02/07 Javascript
浅谈Vue.js 中的 v-on 事件指令的使用
2018/11/25 Javascript
13 个npm 快速开发技巧(推荐)
2019/07/04 Javascript
Vue中关闭弹窗组件时销毁并隐藏操作
2020/09/01 Javascript
JavaScript 常见的继承方式汇总
2020/09/17 Javascript
[03:38]TI4西雅图DOTA2前线报道 71专访
2014/07/08 DOTA
巧用Python装饰器 免去调用父类构造函数的麻烦
2012/05/18 Python
Python实现大文件排序的方法
2015/07/10 Python
python制作爬虫并将抓取结果保存到excel中
2016/04/06 Python
tensorflow学习笔记之简单的神经网络训练和测试
2018/04/15 Python
Python 类的特殊成员解析
2018/06/20 Python
selenium设置proxy、headers的方法(phantomjs、Chrome、Firefox)
2018/11/29 Python
python字典的常用方法总结
2019/07/31 Python
Python简单实现区域生长方式
2020/01/16 Python
Python virtualenv虚拟环境实现过程解析
2020/04/18 Python
咖啡为什么会有酸味?你喝到的咖啡為什麼是酸的?
2021/03/17 冲泡冲煮
家乐福台湾线上购物网:Carrefour台湾
2020/09/15 全球购物
奢华时尚的创新平台:Baltini
2020/10/03 全球购物
应聘医药销售自荐书范文
2014/02/08 职场文书
《果园机器人》教学反思
2014/04/13 职场文书
离婚协议书标准格式
2014/10/04 职场文书
党员个人自我评价
2015/03/03 职场文书
2015年销售内勤工作总结
2015/04/27 职场文书
小学家庭教育心得体会
2016/01/14 职场文书
环境保护宣传标语大全!
2019/06/28 职场文书
Python基于百度API识别并提取图片中文字
2021/06/27 Python