如何在Django中设置定时任务的方法示例


Posted in Python onJanuary 18, 2019

Django 作为后端Web开发框架,有时候我们需要用到定时任务来或者固定频次的任务来执行某段代码,这时我们就要用到Celery了。Django中有一个中间件:Django-celery

环境:

  • Python 3.6
  • Django为小于1.8版本
  • Celery为3.1版本

第一步安装:django-celery

pip install django-celery

第二步:配置celery和任务

创建测试django环境:

django-admin.py createproject test
django-admin.py startapp demo

创建好的项目布局如下:

- proj/
 - manage.py
 - proj/
  - __init__.py
  - celery.py
  - settings.py
  - urls.py
 - demo/
  - migrations
  - __init__.py
  - admin.py
  - apps.py
  - models.py
  - tasks.py
  - tests.py
  - views.py

2.1 配置celery.py文件

需要替换的内容,我都在对应的行后提示了,剩下的内容默认就好

创建test/test/celery.py文件,内容如下:

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
 
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')  # “proj.settings”替换为你的项目信息:test.settings
 
app = Celery('proj') # 这里的proj替换为你的项目名称:test
 
# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#  should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')
 
# Load task modules from all registered Django app configs.
app.autodiscover_tasks()
 
 
@app.task(bind=True)
def debug_task(self):
  print('Request: {0!r}'.format(self.request))

2.2 配置项目的init.py中配置celery内容

打开test/test/__init_.py文件,添加内容:

from __future__ import absolute_import, unicode_literals
 
# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app
 
__all__ = ('celery_app',)

2.3 在task.py中添加计划任务

编辑test/demo/task.py文件,添加计划任务,内容如下:

# Create your tasks here
from __future__ import absolute_import, unicode_literals
from celery import shared_task
 
 
@shared_task
def add(x, y):
  return x + y
 
 
@shared_task
def mul(x, y):
  return x * y
 
 
@shared_task
def xsum(numbers):
  return sum(numbers)

第三步:任务执行

运行django项目: python manage.py runserver

3.1 后台添加计划任务

访问“http://localhost:8000/admin/”,在celery的管理页面里,选择Periodic tasks,进行任务添加。选择对应的任务,设置定时或者周期时间

3.2 启动定时的celery服务

注意:celery依赖redis服务,需要提前运行redis服务:`redis-server`

# 以下两个命令在不同的shell窗口里执行,需要在django的目录下
python manager.py celery beat -l info  #接收定时任务的命令
python manager.py celery worker -l info #执行定时任务的命令,此shell窗口会看到任务的输入信息

3.3 启动单次的celery服务

注意:celery依赖redis服务,需要提前运行redis服务:`redis-server`

python manager.py shell  # 进到django的shell里
from demo.task import mul, xsum  # 导入task任务
a = mul()
b = xsum()
# 执行a, b会输出信息
a(1,2)
b(1)

PS:django-crontab实现Django定时任务

django-crontab安装:

pip install django-crontab

django-crontab加入:只需要将django-crontab加入到settings.py的INSTALLED_APPS即可。如下代码:

INSTALLED_APPS = (

'django_crontab',

...

)

django-crontab配置:settings.py中加入django-crontab的命令即可:

CRONJOBS = [

  ('47 11 * * *', 'django.core.management.call_command', ['closepoll'],{},'>> /var/run.log'),

]

格式:

参数1:定时 例如47 11 * * * 表示每天的11时47分执行
参数2:方法的python模块路径,如果执行django-admin命令,则写django.core.management.call_command
参数3:方法的位置参数列表(默认值:[]),如果执行django-admin命令,则填写所需执行的命令,例如我们在polls中已经定义过的closepoll
参数4:方法的关键字参数的dict(默认值:{})
参数5:执行log存放位置(即重定向到文件,默认:'')

django-crontab任务加载:

django-crontab任务加载比较简单,只需要运行 python manage.py crontab add 即可

查看已经激活的任务使用 python manage.py crontab show

删除已经有的任务使用 python manage.py crontab remove

如果你修改了任务记得一定要使用 python manage.py crontab add 这个会更新定时任务

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python字符串加密解密的三种方法分享(base64 win32com)
Jan 19 Python
python操作字典类型的常用方法(推荐)
May 16 Python
python通过getopt模块如何获取执行的命令参数详解
Dec 29 Python
python 构造三维全零数组的方法
Nov 12 Python
基于PyQt4和PySide实现输入对话框效果
Feb 27 Python
django Admin文档生成器使用详解
Jul 22 Python
django的ORM操作 增加和查询
Jul 26 Python
python中的RSA加密与解密实例解析
Nov 18 Python
Django restframework 框架认证、权限、限流用法示例
Dec 21 Python
pytorch 实现删除tensor中的指定行列
Jan 13 Python
python实现密码验证合格程序的思路详解
Jun 01 Python
Python爬取梨视频的示例
Jan 29 Python
Python设计模式之工厂方法模式实例详解
Jan 18 #Python
Python设计模式之原型模式实例详解
Jan 18 #Python
基于Python实现迪杰斯特拉和弗洛伊德算法
May 27 #Python
Python中logging实例讲解
Jan 17 #Python
python矩阵/字典实现最短路径算法
Jan 17 #Python
python实现Dijkstra静态寻路算法
Jan 17 #Python
解决在Python编辑器pycharm中程序run正常debug错误的问题
Jan 17 #Python
You might like
php curl中gzip的压缩性能测试实例分析
2016/11/08 PHP
Mootools 1.2教程 定时器和哈希简介
2009/09/15 Javascript
js 获取class的元素的方法 以及创建方法getElementsByClassName
2013/03/11 Javascript
浏览器兼容console对象的简要解决方案分享
2013/10/24 Javascript
js取消单选按钮选中示例代码
2013/11/14 Javascript
jquery序列化表单去除指定元素示例代码
2014/04/10 Javascript
jquery实现多行文字图片滚动效果示例代码
2014/10/10 Javascript
实例详解jQuery结合GridView控件的使用方法
2016/01/04 Javascript
Bootstrap3制作自己的导航栏
2016/05/12 Javascript
js带闹铃功能的倒计时代码
2016/09/29 Javascript
vue 封装自定义组件之tabal列表编辑单元格组件实例代码
2017/09/07 Javascript
React Native预设占位placeholder的使用
2017/09/28 Javascript
vue项目动态设置页面title及是否缓存页面的问题
2018/11/08 Javascript
基于JS开发微信网页录音功能的实例代码
2019/04/30 Javascript
layui table数据修改的回显方法
2019/09/04 Javascript
JavaScript中arguments的使用方法详解
2020/12/20 Javascript
js实现随机点名
2021/01/19 Javascript
[01:02]DOTA2辉夜杯决赛日 CDEC.Y对阵VG赛前花絮
2015/12/27 DOTA
python进阶教程之异常处理
2014/08/30 Python
Python 函数基础知识汇总
2018/03/09 Python
python实现决策树、随机森林的简单原理
2018/03/26 Python
Python multiprocessing多进程原理与应用示例
2019/02/28 Python
Visual Studio code 配置Python开发环境
2020/09/11 Python
保洁主管岗位职责
2013/11/20 职场文书
就业协议书怎么填
2014/04/11 职场文书
婚礼秀策划方案
2014/05/19 职场文书
2014年共青团工作总结
2014/12/10 职场文书
环卫工人慰问信
2015/02/15 职场文书
幼儿园托班开学寄语(2015秋季)
2015/05/27 职场文书
2016新年年会主持词
2015/07/06 职场文书
2016护理专业求职自荐书
2016/01/28 职场文书
纪念建国70周年演讲稿
2019/07/19 职场文书
Python字符串对齐方法使用(ljust()、rjust()和center())
2021/04/26 Python
Python办公自动化之Excel(中)
2021/05/24 Python
Redis读写分离搭建的完整步骤
2021/09/14 Redis
Go语言基础函数基本用法及示例详解
2021/11/17 Golang