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 03 Python
Python 3中print函数的使用方法总结
Aug 08 Python
Python实现冒泡排序的简单应用示例
Dec 11 Python
numpy.std() 计算矩阵标准差的方法
Jul 11 Python
攻击者是如何将PHP Phar包伪装成图像以绕过文件类型检测的(推荐)
Oct 11 Python
使用Python抓取豆瓣影评数据的方法
Oct 17 Python
python查看文件大小和文件夹内容的方法
Jul 08 Python
python设置环境变量的作用和实例
Jul 09 Python
python文档字符串(函数使用说明)使用详解
Jul 30 Python
自定义Django Form中choicefield下拉菜单选取数据库内容实例
Mar 13 Python
python装饰器三种装饰模式的简单分析
Sep 04 Python
python 利用opencv实现图像网络传输
Nov 12 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中进行身份认证
2006/10/09 PHP
php foreach正序倒序输出示例代码
2014/07/01 PHP
解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法
2015/10/23 PHP
PHP安装threads多线程扩展基础教程
2015/11/17 PHP
Yii调试查看执行SQL语句的方法
2016/07/15 PHP
解析javascript 实用函数的使用详解
2013/05/10 Javascript
使用原生js封装webapp滑动效果(惯性滑动、滑动回弹)
2014/05/06 Javascript
JS实现至少包含字母、大小写数字、字符的密码等级的两种方法
2015/02/03 Javascript
jQuery实现仿腾讯迷你首页选项卡效果代码
2015/09/17 Javascript
JavaScript中的ParseInt(&quot;08&quot;)和“09”返回0的原因分析及解决办法
2016/05/19 Javascript
js实现鼠标拖动功能
2017/03/20 Javascript
微信小程序 检查接口状态实例详解
2017/06/23 Javascript
简单谈谈axios中的get,post方法
2017/06/25 Javascript
微信小程序之前台循环数据绑定
2017/08/18 Javascript
微信小程序使用audio组件播放音乐功能示例【附源码下载】
2017/12/08 Javascript
解决layer弹层遮罩挡住窗体的问题
2018/08/17 Javascript
JS实现简易贪吃蛇游戏
2020/08/24 Javascript
详解详解Python中writelines()方法的使用
2015/05/25 Python
python strip() 函数和 split() 函数的详解及实例
2017/02/03 Python
Python实现string字符串连接的方法总结【8种方式】
2018/07/06 Python
python组合无重复三位数的实例
2018/11/13 Python
python+selenium select下拉选择框定位处理方法
2019/08/24 Python
python入门之井字棋小游戏
2020/03/05 Python
opencv中图像叠加/图像融合/按位操作的实现
2020/04/01 Python
python re.match()用法相关示例
2021/01/27 Python
基于IE10/HTML5 开发
2013/04/22 HTML / CSS
以思科路由器为例你写下单臂路由的配置命令
2013/08/03 面试题
介绍一下Mysql的存储引擎
2015/02/12 面试题
办理暂住证介绍信
2014/01/11 职场文书
网络技术专业求职信
2014/05/02 职场文书
六一儿童节演讲稿
2014/05/23 职场文书
2015年音乐教研组工作总结
2015/07/22 职场文书
幼儿园科学课教学反思
2016/03/03 职场文书
为什么 Nginx 比 Apache 更牛逼
2021/03/31 Servers
css实现左上角飘带效果的完整代码
2022/03/18 HTML / CSS
Python如何利用pandas读取csv数据并绘图
2022/07/07 Python