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编写一个在Linux下实现截图分享的脚本的教程
Apr 24 Python
Python selenium 父子、兄弟、相邻节点定位方式详解
Sep 15 Python
python机器学习理论与实战(五)支持向量机
Jan 19 Python
Django 实现下载文件功能的示例
Mar 06 Python
python使用Turtle库绘制动态钟表
Nov 19 Python
python tkinter实现屏保程序
Jul 30 Python
Python编程中类与类的关系详解
Aug 08 Python
基于python连接oracle导并出数据文件
Apr 28 Python
Python select及selectors模块概念用法详解
Jun 22 Python
Python reversed反转序列并生成可迭代对象
Oct 22 Python
python 制作简单的音乐播放器
Nov 25 Python
python中if嵌套命令实例讲解
Feb 25 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中使用Oracle数据库(4)
2006/10/09 PHP
如何解决PHP无法实现多线程的问题
2015/09/25 PHP
PHP页面输出搜索后跳转下一页的处理方法
2016/09/30 PHP
遍历echsop的region表形成缓存的程序实例代码
2016/11/01 PHP
详谈phpAdmin修改密码后拒绝访问的问题
2017/04/03 PHP
jQuery弹出层始终垂直居中相对于屏幕或当前窗口
2013/04/01 Javascript
jquery ajax应用中iframe自适应高度问题解决方法
2014/04/12 Javascript
jQuery使用之标记元素属性用法实例
2015/01/19 Javascript
Vue2.0设置全局样式(less/sass和css)
2017/11/18 Javascript
three.js实现3D模型展示的示例代码
2017/12/31 Javascript
angular.js和vue.js中实现函数去抖示例(debounce)
2018/01/18 Javascript
webpack4之SplitChunksPlugin使用指南
2018/06/12 Javascript
vue组件实践之可搜索下拉框功能
2018/11/25 Javascript
jQuery实现模拟搜索引擎的智能提示功能简单示例
2019/01/27 jQuery
基于Vue实现的多条件筛选功能的详解(类似京东和淘宝功能)
2019/05/07 Javascript
jquery登录的异步验证操作示例
2019/05/09 jQuery
VUE动态生成word的实现
2020/07/26 Javascript
OpenLayers3加载常用控件使用方法详解
2020/09/25 Javascript
JavaScript实现移动端拖动元素
2020/11/24 Javascript
python合并文本文件示例
2014/02/07 Python
python之mock模块基本使用方法详解
2019/06/27 Python
使用matplotlib绘制图例标签中带有公式的图
2019/12/13 Python
Keras Convolution1D与Convolution2D区别说明
2020/05/22 Python
CSS3 display知识详解
2015/11/25 HTML / CSS
如何用Python输出一个Fibonacci数列
2016/08/28 面试题
餐饮加盟计划书
2014/01/10 职场文书
幼儿园保育员辞职信
2014/01/12 职场文书
2014年煤矿工作总结
2014/11/24 职场文书
2014年工商所工作总结
2014/12/09 职场文书
教师思想工作总结2015
2015/05/13 职场文书
生死抉择观后感
2015/06/09 职场文书
2016参观监狱警示教育活动心得体会
2016/01/15 职场文书
mysql批量新增和存储的方法实例
2021/04/07 MySQL
数据库之SQL技巧整理案例
2021/07/07 SQL Server
python模块与C和C++动态库相互调用实现过程示例
2021/11/02 Python
Oracle配置dblink访问PostgreSQL的操作方法
2022/03/21 PostgreSQL