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和shell实现的校验IP地址合法性脚本分享
Oct 23 Python
Python基于pillow判断图片完整性的方法
Sep 18 Python
Python基础中所出现的异常报错总结
Nov 19 Python
Python中模块pymysql查询结果后如何获取字段列表
Jun 05 Python
Python 爬虫之超链接 url中含有中文出错及解决办法
Aug 03 Python
python numpy函数中的linspace创建等差数列详解
Oct 13 Python
有趣的python小程序分享
Dec 05 Python
基于Django filter中用contains和icontains的区别(详解)
Dec 12 Python
Python编程实现从字典中提取子集的方法分析
Feb 09 Python
Python3实现购物车功能
Apr 18 Python
python跨文件使用全局变量的实现
Nov 17 Python
Python编程根据字典列表相同键的值进行合并
Oct 05 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_num_rows VS COUNT 效率问题分析
2011/04/23 PHP
Views rows style模板重写代码
2011/05/16 PHP
php增删改查示例自己写的demo
2013/09/04 PHP
PHP中多维数组的foreach遍历示例
2014/06/13 PHP
Yii框架创建cronjob定时任务的方法分析
2017/05/23 PHP
php 中self,this的区别和操作方法实例分析
2019/11/04 PHP
PHP开发API接口签名生成及验证操作示例
2020/05/27 PHP
JQuery Easyui Tree的oncheck事件实现代码
2010/05/28 Javascript
jQuery ajax(复习)—Baidu ajax request分离版
2013/01/24 Javascript
jquery 隐藏与显示tr标签示例代码
2014/06/06 Javascript
javascript相关事件的几个概念
2015/05/21 Javascript
jQuery左侧大图右侧小图焦点图幻灯切换代码分享
2015/08/19 Javascript
jquery制作图片时钟特效
2020/03/30 Javascript
angularjs实现首页轮播图效果
2017/04/14 Javascript
详解升级react-router 4 踩坑指南
2017/08/14 Javascript
基于vue.js快速搭建图书管理平台
2017/10/29 Javascript
使用Bootstrap + Vue.js实现表格的动态展示、新增和删除功能
2017/11/27 Javascript
vue this.reload 方法 配置
2018/09/12 Javascript
浅析Proxy可以优化vue的数据监听机制问题及实现思路
2018/11/29 Javascript
开发中常用的25个JavaScript单行代码(小结)
2019/06/28 Javascript
Java多线程编程中ThreadLocal类的用法及深入
2016/06/21 Python
Python利用递归和walk()遍历目录文件的方法示例
2017/07/14 Python
手把手教你python实现SVM算法
2017/12/27 Python
Python数据分析之双色球中蓝红球分析统计示例
2018/02/03 Python
对python中的argv和argc使用详解
2018/12/15 Python
selenium+PhantomJS爬取豆瓣读书
2019/08/26 Python
Python GUI自动化实现绕过验证码登录
2020/01/10 Python
Win10下配置tensorflow-gpu的详细教程(无VS2015/2017)
2020/07/14 Python
手工制作的意大利礼服鞋:Ace Marks
2018/12/15 全球购物
小学生学习感言
2014/03/10 职场文书
企业文化建设实施方案
2014/03/22 职场文书
初中英语演讲稿
2014/04/29 职场文书
林肯就职演讲稿
2014/05/19 职场文书
2015年端午节活动总结
2015/02/11 职场文书
MySQL查看表和清空表的常用命令总结
2021/05/26 MySQL
win10识别不了U盘怎么办 win10系统读取U盘失败的解决办法
2022/08/05 数码科技