如何在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中的字典与成员运算符初步探究
Oct 13 Python
Python彩色化Linux的命令行终端界面的代码实例分享
Jul 02 Python
深入浅析ImageMagick命令执行漏洞
Oct 11 Python
Python Flask-web表单使用详解
Nov 18 Python
Python代码实现KNN算法
Dec 20 Python
python3获取两个日期之间所有日期,以及比较大小的实例
Apr 08 Python
python事件驱动event实现详解
Nov 21 Python
python利用小波分析进行特征提取的实例
Jan 09 Python
PyQt QListWidget修改列表项item的行高方法
Jun 20 Python
Django之富文本(获取内容,设置内容方式)
May 21 Python
python能在浏览器能运行吗
Jun 17 Python
Python hashlib模块的使用示例
Oct 09 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函数解决SQL injection
2006/10/09 PHP
浅析PHP页面局部刷新功能的实现小结
2013/06/21 PHP
php修改文件上传限制方法汇总
2015/04/07 PHP
Linux(CentOS)下PHP扩展PDO编译安装的方法
2016/04/07 PHP
PHP 裁剪图片
2021/03/09 PHP
js removeChild 障眼法 可能出现的错误
2009/10/06 Javascript
js报错 Object doesn't support this property or method的原因分析
2011/03/31 Javascript
jQuery实现批量判断表单中文本框非空的方法(2种方法)
2015/12/09 Javascript
js一维数组、多维数组和对象的混合使用方法
2016/04/03 Javascript
Bootstrap媒体对象的实现
2016/05/01 Javascript
Document.body.scrollTop的值总为零的快速解决办法
2016/06/09 Javascript
js学习笔记之事件处理模型
2016/10/31 Javascript
React 组件间的通信示例
2018/06/14 Javascript
Vue组件教程之Toast(Vue.extend 方式)详解
2019/01/27 Javascript
用js限制网页只在微信浏览器中打开(或者只能手机端访问)
2020/12/24 Javascript
Node.js API详解之 Error模块用法实例分析
2020/05/14 Javascript
vuex实现购物车功能
2020/06/28 Javascript
解决vue动态路由异步加载import组件,加载不到module的问题
2020/07/26 Javascript
js实现点击按钮随机生成背景颜色
2020/09/05 Javascript
Python搭建APNS苹果推送通知推送服务的相关模块使用指南
2016/06/02 Python
python 获取utc时间转化为本地时间的方法
2018/12/31 Python
python引用(import)某个模块提示没找到对应模块的解决方法
2019/01/19 Python
python3 BeautifulSoup模块使用字典的方法抓取a标签内的数据示例
2019/11/28 Python
flask项目集成swagger的方法
2020/12/09 Python
医疗保健专业人士购物网站:Scrubs & Beyond
2017/02/08 全球购物
Superdry瑞典官网:英国日本街头风品牌
2017/05/17 全球购物
家庭睡衣和家庭用品:Little Blue House
2018/03/18 全球购物
实习单位评语
2014/04/26 职场文书
工程材料采购方案
2014/05/18 职场文书
酒店前台岗位职责
2015/04/16 职场文书
2015年乡镇安全生产工作总结
2015/05/19 职场文书
2015年超市工作总结范文
2015/05/26 职场文书
2015中学教学工作总结
2015/07/22 职场文书
2016学校先进集体事迹材料
2016/02/29 职场文书
详解Java线程池是如何重复利用空闲线程的
2021/06/26 Java/Android
Spring Boot配合PageHelper优化大表查询数据分页
2022/04/20 Java/Android