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 02 Python
Python中使用OpenCV库来进行简单的气象学遥感影像计算
Feb 19 Python
使用Python的Django框架结合jQuery实现AJAX购物车页面
Apr 11 Python
python 计算文件的md5值实例
Jan 13 Python
Django rest framework工具包简单用法示例
Jul 20 Python
使用k8s部署Django项目的方法步骤
Jan 14 Python
python实现超市商品销售管理系统
Nov 22 Python
Win10用vscode打开anaconda环境中的python出错问题的解决
May 25 Python
解决python和pycharm安装gmpy2 出现ERROR的问题
Aug 28 Python
Python加载数据的5种不同方式(收藏)
Nov 13 Python
python制作微博图片爬取工具
Jan 16 Python
使用Python爬虫爬取小红书完完整整的全过程
Jan 19 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
mysql下创建字段并设置主键的php代码
2010/05/16 PHP
Linux fgetcsv取得的数组元素为空字符串的解决方法
2011/11/25 PHP
Nginx下配置codeigniter框架方法
2015/04/07 PHP
ThinkPHP实现简单登陆功能
2017/04/28 PHP
laravel 5.3 单用户登录简单实现方法
2019/10/14 PHP
laravel通过a标签从视图向控制器实现传值
2019/10/15 PHP
提高网站信任度的技巧
2008/10/17 Javascript
HTML5附件拖拽上传drop &amp; google.gears实现代码
2011/04/28 Javascript
treepanel动态加载数据实现代码
2012/12/15 Javascript
JS、jquery实现几分钟前、几小时前、几天前等时间差显示效果的代码实例分享
2014/04/11 Javascript
js鼠标经过tab选项卡时实现切换延迟
2017/03/24 Javascript
Angularjs 1.3 中的$parse实例代码
2017/09/14 Javascript
详解ES6之async+await 同步/异步方案
2017/09/19 Javascript
仿淘宝JSsearch搜索下拉深度用法
2018/01/15 Javascript
读懂CommonJS的模块加载
2019/04/19 Javascript
微信小程序实现判断是分享到群还是个人功能示例
2019/05/03 Javascript
nodejs使用node-xlsx生成excel的方法示例
2019/08/22 NodeJs
Vue中jsx不完全应用指南小结
2019/11/01 Javascript
Win7下搭建python开发环境图文教程(安装Python、pip、解释器)
2016/05/17 Python
python 捕获shell脚本的输出结果实例
2017/01/04 Python
Python multiprocessing多进程原理与应用示例
2019/02/28 Python
Python使用指定端口进行http请求的例子
2019/07/25 Python
Python编写带选项的命令行程序方法
2019/08/13 Python
python打造爬虫代理池过程解析
2019/08/15 Python
django实现后台显示媒体文件
2020/04/07 Python
深入了解Python装饰器的高级用法
2020/08/13 Python
python两个list[]相加的实现方法
2020/09/23 Python
HTML5 新表单类型示例代码
2018/03/20 HTML / CSS
PHP面试题及答案二
2015/05/23 面试题
销售文员岗位职责
2013/11/29 职场文书
车间调度岗位职责
2013/11/30 职场文书
客服主管岗位职责
2013/12/13 职场文书
骨干教师培训感言
2014/01/16 职场文书
法制宣传实施方案
2014/03/13 职场文书
离婚协议书样本
2015/01/26 职场文书
对领导班子的意见和建议
2015/06/08 职场文书