如何在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通过字典dict判断指定键值是否存在的方法
Mar 21 Python
基于python中pygame模块的Linux下安装过程(详解)
Nov 09 Python
快速了解Python中的装饰器
Jan 11 Python
使用python装饰器计算函数运行时间的实例
Apr 21 Python
pandas.DataFrame删除/选取含有特定数值的行或列实例
Nov 07 Python
Python类的继承、多态及获取对象信息操作详解
Feb 28 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
Oct 30 Python
Python查找不限层级Json数据中某个key或者value的路径方式
Feb 27 Python
解决Python图形界面中设置尺寸的问题
Mar 05 Python
Python装饰器实现方法及应用场景详解
Mar 26 Python
Pytorch转tflite方式
May 25 Python
详解Python为什么不用设计模式
Jun 24 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
分页显示Oracle数据库记录的类之一
2006/10/09 PHP
PHP 在5.1.* 和5.2.*之间 PDO数据库操作中的不同之处小结
2012/03/07 PHP
php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
2020/04/05 PHP
jQuery 浮动广告实现代码
2008/12/25 Javascript
Mootools 1.2教程(21)——类(二)
2009/09/15 Javascript
jQuery源码分析之Event事件分析
2010/06/07 Javascript
突发奇想的一个jquery插件
2010/11/19 Javascript
jquery隐藏标签和显示标签的实例
2013/11/11 Javascript
对于Form表单reset方法的新认识
2014/03/05 Javascript
seaJs的模块定义和模块加载浅析
2014/06/06 Javascript
JS实现屏蔽网页右键复制及ctrl+c复制的方法【2种方法】
2016/09/04 Javascript
jquery配合.NET实现点击指定绑定数据并且能够一键下载
2016/10/28 Javascript
jquery tmpl模板(实例讲解)
2017/09/02 jQuery
微信小程序使用video组件播放视频功能示例【附源码下载】
2017/12/08 Javascript
JS解析后台返回的JSON格式数据实例
2018/08/06 Javascript
vue-cli3+ts+webpack实现多入口多出口功能
2019/05/30 Javascript
原生js实现瀑布流效果
2020/03/09 Javascript
JS原型对象操作实例分析
2020/06/06 Javascript
python编码最佳实践之总结
2016/02/14 Python
Python闭包的两个注意事项(推荐)
2017/03/20 Python
windows上安装Anaconda和python的教程详解
2017/03/28 Python
python版本的仿windows计划任务工具
2018/04/30 Python
Django+Ajax+jQuery实现网页动态更新的实例
2018/05/28 Python
Django跨域请求问题的解决方法示例
2018/06/16 Python
详解Django的model查询操作与查询性能优化
2018/10/16 Python
对python中dict和json的区别详解
2018/12/18 Python
python 实现GUI(图形用户界面)编程详解
2019/07/17 Python
python tkinter GUI绘制,以及点击更新显示图片代码
2020/03/14 Python
Html5之自定义属性(data-,dataset)
2019/11/19 HTML / CSS
元旦晚会邀请函
2014/02/01 职场文书
工商企业管理应届生求职信
2014/05/04 职场文书
工商局所长四风自我剖析及整改措施
2014/10/26 职场文书
国王的演讲观后感
2015/06/03 职场文书
简爱电影观后感
2015/06/10 职场文书
python中 Flask Web 表单的使用方法
2022/05/20 Python
Redis特殊数据类型HyperLogLog基数统计算法讲解
2022/06/01 Redis