如何在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 相关文章推荐
17个Python小技巧分享
Jan 23 Python
python套接字流重定向实例汇总
Mar 03 Python
Python中工作日类库Busines Holiday的介绍与使用
Jul 06 Python
python模块之paramiko实例代码
Jan 31 Python
解决Python中list里的中文输出到html模板里的问题
Dec 17 Python
python设置环境变量的原因和方法
Jun 24 Python
将keras的h5模型转换为tensorflow的pb模型操作
May 25 Python
Python 使用 PyQt5 开发的关机小工具分享
Jul 16 Python
Python生成并下载文件后端代码实例
Aug 31 Python
利用python做表格数据处理
Apr 13 Python
Python中requests做接口测试的方法
May 30 Python
pytorch分类模型绘制混淆矩阵以及可视化详解
Apr 07 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
火影忍者:这才是千手柱间和扉间的真正死因,角都就比较搞笑了!
2020/03/10 日漫
深入php-fpm的两种进程管理模式详解
2013/06/03 PHP
PHP中ini_set与ini_get用法实例
2014/11/04 PHP
Confirmer JQuery确认对话框组件
2010/06/09 Javascript
JavaScript使用过程中需要注意的地方和一些基本语法
2010/08/26 Javascript
Jquery UI震动效果实现原理及步骤
2013/02/04 Javascript
js计算任意值之间随机数的方法
2015/01/16 Javascript
JavaScript控制按钮可用或不可用的方法
2015/04/03 Javascript
用JavaScript判断CSS浏览器类型前缀的两种方法
2015/10/08 Javascript
如何解决ligerUI布局时Center中的Tab高度大小
2015/11/24 Javascript
jQuery实现复制到粘贴板功能
2017/02/11 Javascript
Javascript面试经典套路reduce函数查重
2017/03/23 Javascript
jQuery插件FusionCharts实现的MSBar2D图效果示例【附demo源码】
2017/03/24 jQuery
Vue中使用vue-i18插件实现多语言切换功能
2018/04/25 Javascript
vue-router为激活的路由设置样式操作
2020/07/18 Javascript
nodejs+koa2 实现模仿springMVC框架
2020/10/21 NodeJs
javascript局部自定义鼠标右键菜单
2020/12/08 Javascript
js基于canvas实现时钟组件
2021/02/07 Javascript
vue-router懒加载的3种方式汇总
2021/02/28 Vue.js
[04:23]DOTA2上海特锦赛小组赛第一日 TOP10精彩集锦
2016/02/27 DOTA
python使用wmi模块获取windows下的系统信息 监控系统
2015/10/27 Python
Python实现的选择排序算法示例
2017/11/29 Python
Python简单实现查找一个字符串中最长不重复子串的方法
2018/03/26 Python
使用pip安装python库的多种方式
2019/07/31 Python
python爬虫解决验证码的思路及示例
2019/08/01 Python
Django为窗体加上防机器人的验证码功能过程解析
2019/08/14 Python
python中字典按键或键值排序的实现代码
2019/08/27 Python
关于Python turtle库使用时坐标的确定方法
2020/03/19 Python
用pandas划分数据集实现训练集和测试集
2020/07/20 Python
您的健身减肥和健康饮食专家:vitafy
2017/06/06 全球购物
苏格兰销售女装、男装和童装的连锁店:M&Co
2018/03/16 全球购物
介绍一下SQL Server里面的索引视图
2016/07/31 面试题
公司应聘求职信
2014/06/21 职场文书
小学六一儿童节活动总结
2015/05/05 职场文书
青年教师听课心得体会
2016/01/15 职场文书
搭建Yolov5服务器
2022/04/30 Servers