如何在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使用递归解决全排列数字示例
Feb 11 Python
python服务器端收发请求的实现代码
Sep 29 Python
Python中的__new__与__init__魔术方法理解笔记
Nov 08 Python
python SSH模块登录,远程机执行shell命令实例解析
Jan 12 Python
pyenv虚拟环境管理python多版本和软件库的方法
Dec 26 Python
python GUI库图形界面开发之PyQt5工具栏控件QToolBar的详细使用方法与实例
Feb 28 Python
tensorflow指定CPU与GPU运算的方法实现
Apr 21 Python
浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置
Jun 30 Python
Python调用C语言程序方法解析
Jul 07 Python
Python基于Webhook实现github自动化部署
Nov 28 Python
python的dict判断key是否存在的方法
Dec 09 Python
Python日志打印里logging.getLogger源码分析详解
Jan 17 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
MYSQL数据库初学者使用指南
2006/11/16 PHP
Linux下安装oracle客户端并配置php5.3
2014/10/12 PHP
PHP aes (ecb)解密后乱码问题
2015/06/22 PHP
php使用curl通过代理获取数据的实现方法
2016/05/16 PHP
一个JavaScript继承的实现
2006/10/24 Javascript
分享别人写的一个小型js框架
2007/08/13 Javascript
jQuery Lightbox 图片展示插件使用说明
2010/04/25 Javascript
extjs grid设置某列背景颜色和字体颜色的实现方法
2010/09/06 Javascript
Ext.get() 和 Ext.query()组合使用实现最灵活的取元素方式
2011/09/26 Javascript
jquery实现翻动fadeIn显示的方法
2015/03/05 Javascript
Angularjs实现多个页面共享数据的方式
2016/03/29 Javascript
Javascript之BOM(window对象)详解
2016/05/25 Javascript
javascript中的try catch异常捕获机制用法分析
2016/12/14 Javascript
微信小程序 详解下拉加载与上拉刷新实现方法
2017/01/13 Javascript
Vue.js实现一个漂亮、灵活、可复用的提示组件示例
2017/03/17 Javascript
Vue.js仿微信聊天窗口展示组件功能
2017/08/11 Javascript
深入掌握 react的 setState的工作机制
2017/09/27 Javascript
javascript与PHP动态往类中添加方法对比
2018/03/21 Javascript
Python实现七彩蟒蛇绘制实例代码
2018/01/16 Python
python爬取个性签名的方法
2018/06/17 Python
解决tensorflow模型参数保存和加载的问题
2018/07/26 Python
使用Python开发SQLite代理服务器的方法
2018/12/07 Python
python 读取二进制 显示图片案例
2020/04/24 Python
Python如何给函数库增加日志功能
2020/08/04 Python
解决python 执行shell命令无法获取返回值的问题
2020/12/05 Python
python实现PolynomialFeatures多项式的方法
2021/01/06 Python
.net软件工程师应聘上机试题
2015/03/10 面试题
过程装备与控制工程专业个人的求职信
2013/12/01 职场文书
2014年自我评价
2014/01/04 职场文书
写给老师的表扬信
2014/01/21 职场文书
会员卡清退活动总结
2014/08/27 职场文书
带刀到教室的检讨书
2014/10/04 职场文书
幼儿园三八妇女节活动总结
2015/02/06 职场文书
销售区域经理岗位职责
2015/04/10 职场文书
行政助理岗位职责范本
2015/04/11 职场文书
Pandas搭配lambda组合使用详解
2022/01/22 Python