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深入学习之装饰器
Aug 31 Python
Python变量作用范围实例分析
Jul 07 Python
在Python中pandas.DataFrame重置索引名称的实例
Nov 06 Python
pygame游戏之旅 python和pygame安装教程
Nov 20 Python
Python实现获取系统临时目录及临时文件的方法示例
Jun 26 Python
使用pandas读取文件的实现
Jul 31 Python
Django admin.py 在修改/添加表单界面显示额外字段的方法
Aug 22 Python
浅析python redis的连接及相关操作
Nov 07 Python
python GUI库图形界面开发之PyQt5布局控件QGridLayout详细使用方法与实例
Mar 06 Python
python 的topk算法实例
Apr 02 Python
python报错TypeError: ‘NoneType‘ object is not subscriptable的解决方法
Nov 05 Python
python 邮件检测工具mmpi的使用
Jan 04 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打造属于自己的MVC框架
2012/03/07 PHP
php+ajax实现仿百度查询下拉内容功能示例
2017/10/20 PHP
bindParam和bindValue的区别以及在Yii2中的使用详解
2018/03/12 PHP
php 调用百度sms来发送短信的实现示例
2018/11/02 PHP
Yii框架参数配置文件params用法实例分析
2019/09/11 PHP
IE8 内存泄露(内存一直增长 )的原因及解决办法
2016/04/06 Javascript
浅析Bootstrap表格的使用
2016/06/23 Javascript
jQuery实现鼠标滑过预览图片大图效果的方法
2017/04/26 jQuery
浅谈让你的代码更简短,更整洁,更易读的ES6小技巧
2018/10/25 Javascript
详解Vue CLI 3.0脚手架如何mock数据
2018/11/23 Javascript
如何从零开始手写Koa2框架
2019/03/22 Javascript
jQuery操作动画完整实例分析
2020/01/10 jQuery
node 版本切换的实现
2020/02/02 Javascript
如何在Vue.JS中使用图标组件
2020/08/04 Javascript
js禁止查看源文件屏蔽Ctrl+u/s、F12、右键等兼容IE火狐chrome
2020/10/01 Javascript
Python修改Excel数据的实例代码
2013/11/01 Python
python查找第k小元素代码分享
2013/12/18 Python
python实现多线程暴力破解登陆路由器功能代码分享
2015/01/04 Python
Windows系统下使用flup搭建Nginx和Python环境的方法
2015/12/25 Python
Python的Flask框架中配置多个子域名的方法讲解
2016/06/07 Python
解决Python正则表达式匹配反斜杠''\''问题
2019/07/17 Python
PyQt5 closeEvent关闭事件退出提示框原理解析
2020/01/08 Python
关于Tensorflow分布式并行策略
2020/02/03 Python
sklearn+python:线性回归案例
2020/02/24 Python
Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
2020/04/20 Python
简单了解python shutil模块原理及使用方法
2020/04/28 Python
Python读取Excel数据并生成图表过程解析
2020/06/18 Python
python解压zip包中文乱码解决方法
2020/11/27 Python
基于html5绘制圆形多角图案
2016/04/21 HTML / CSS
类、抽象类、接口的差异
2016/06/13 面试题
教师评优事迹材料
2014/01/10 职场文书
庆八一活动方案
2014/01/25 职场文书
大学竞选班干部演讲稿
2014/08/21 职场文书
2014年文明创建工作总结
2014/11/25 职场文书
2015元旦晚会主持人开场白+结束语
2014/12/14 职场文书
社区活动总结
2015/02/04 职场文书