django框架如何集成celery进行开发


Posted in Python onMay 24, 2017

上一篇已经介绍了celery的基本知识,本篇以一个小项目为例,详细说明django框架如何集成celery进行开发。

本系列文章的开发环境:

window 7 + python2.7 + pycharm5 + celery3.1.25 + django1.9.4
一、项目功能

      在web应用中,用户触发一个操作,执行后台处理程序,这个程序需要执行很长时间才能返回结果。怎样才能不阻塞http请求,不让用户等待从而提高用户体验呢?这是本例需要解决的问题。具体设计是:用两个网页进行展示,一个网页是提交加法计算任务到后台进行计算;另外一个网页查看所有计算任务的详细情况,如任务ID,任务状态等。

就如下图所示:输入:http://127.0.0.1:8000/index/

django框架如何集成celery进行开发

点击查看任务链接,查看所有任务的执行情况:sucess表示执行成功,started表示已经开始执行了。

    django框架如何集成celery进行开发

二、项目结构

    Broker我这里选择RabbitMQ,结果存储Backend我选择django-celery。

    django框架如何集成celery进行开发

三、开始编程

   1、安装django-celery:  

$ pip install django-celery

   2、新建django工程项目test_celery,如下:

        django框架如何集成celery进行开发

【说明】:tools是django包,和test_celery是同级目录,该包功能主要存放工具类函数和执行的任务;

              celery.py:celery配置文件信息

 3、编辑setting.py,添加配置celery broker和backend

#celery setting
import djcelery
djcelery.setup_loader()  #加载djcelery
BROKER_URL = 'pyamqp://guest@localhost//' #配置broker
BROKER_POOL_LIMIT = 0
CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend' #配置backend

INSTALLED_APPS = [
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'djcelery',  #django-celery必须添加
 'test_celery', 
]
DATABASES = { 'default': {  'ENGINE': 'django.db.backends.mysql',  'NAME': 'celery',  'USER':'username',  'PASSWORD':'password',  'HOST':'ip',  'PORT':3306, }}
4、新建celery.py文件,添加如下内容:
from __future__ import absolute_import
import os
from celery import Celery
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'test_celery.settings')

from django.conf import settings # noqa

app = Celery('test_celery')

# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)


@app.task(bind=True)
def debug_task(self):
 print('Request: {0!r}'.format(self.request))
5、新建tasks.py文件,创建任务
from __future__ import absolute_import
from celery import shared_task
import time

@shared_task(track_started=True)
def add(x, y):
 time.sleep(30) #模拟长时间执行
 return x + y
6、创建model.py,新建存储任务信息的表:
from django.db import models
#在数据库中生成test_celery_add表
class Add(models.Model):
 task_id = models.CharField(max_length=128) #存储taskid
 first = models.IntegerField()    #存储第一个加数
 second = models.IntegerField()    #存储第二个加数
 log_date = models.DateTimeField()   #存储开始时间
7、进入test_celery目录下,有manage.py那一层,执行:
python manage.py makemigrations test_celery
python manage.py migrate

到这里会在数据库中生成以下表:

django框架如何集成celery进行开发

8、接下来编写前端html文件以及view文件,具体请自己编写或者下载源码运行。

9、编码完成后,启动worker,然后就可以在网页上进行模拟操作了 

    进入test_celery项目目录下,也就是有manage.py文件那一层,执行以下命令启动worker:

celery worker -A test_celery -l info
10、在浏览器中,http://127.0.0.1:8000/index/,录入第一个加数和第二个加数,点击计算,就交给后台tasks执行了,这时可以点击查看任务进行查看。 
Python 相关文章推荐
python局域网ip扫描示例分享
Apr 03 Python
python实现堆栈与队列的方法
Jan 15 Python
python使用reportlab实现图片转换成pdf的方法
May 22 Python
python如何获取当前文件夹下所有文件名详解
Jan 25 Python
对Python生成器、装饰器、递归的使用详解
Jul 19 Python
Django命名URL和反向解析URL实现解析
Aug 09 Python
NumPy统计函数的实现方法
Jan 21 Python
PHP基于phpqrcode类库生成二维码过程解析
May 28 Python
Django contrib auth authenticate函数源码解析
Nov 12 Python
Django跨域请求原理及实现代码
Nov 14 Python
python 如何将两个实数矩阵合并为一个复数矩阵
May 19 Python
pandas中关于apply+lambda的应用
Feb 28 Python
python 计算两个日期相差多少个月实例代码
May 24 #Python
django基础之数据库操作方法(详解)
May 24 #Python
python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE方法
May 24 #Python
Python生成密码库功能示例
May 23 #Python
Python计算两个日期相差天数的方法示例
May 23 #Python
基于Python_脚本CGI、特点、应用、开发环境(详解)
May 23 #Python
浅谈django model的get和filter方法的区别(必看篇)
May 23 #Python
You might like
全国FM电台频率大全 - 26 西藏自治区
2020/03/11 无线电
人族 Terran 魔法与科技
2020/03/14 星际争霸
PHP中数字检测is_numeric与ctype_digit的区别介绍
2012/10/04 PHP
基于MySQL到MongoDB简易对照表的详解
2013/06/03 PHP
hadoop常见错误以及处理方法详解
2013/06/19 PHP
Yii2使用swiftmailer发送邮件的方法
2016/05/03 PHP
基于php编程规范(详解)
2017/08/17 PHP
IE8 原生JSON支持
2009/04/13 Javascript
js 数组操作之pop,push,unshift,splice,shift
2014/01/29 Javascript
javascript获取系统当前时间的方法
2015/11/19 Javascript
详解JS正则replace的使用方法
2016/03/06 Javascript
Bootstrap表单布局样式代码
2016/05/31 Javascript
微信小程序 弹窗自定义实例代码
2017/03/08 Javascript
jQuery实现的粘性滚动导航栏效果实例【附源码下载】
2017/10/19 jQuery
微信小程序实现MUI数字输入框效果
2018/01/31 Javascript
AngularJS实现动态切换样式的方法分析
2018/06/26 Javascript
Nodejs把接收图片base64格式保存为文件存储到服务器上
2018/09/26 NodeJs
微信小程序实现选项卡效果
2018/11/06 Javascript
Vue组件间通信方法总结(父子组件、兄弟组件及祖先后代组件间)
2019/04/17 Javascript
最简单的vue消息提示全局组件的方法
2019/06/16 Javascript
vuex + keep-alive实现tab标签页面缓存功能
2019/10/17 Javascript
JavaScript鼠标拖拽事件详解
2020/04/03 Javascript
python中利用numpy.array()实现俩个数值列表的对应相加方法
2019/08/26 Python
Xadmin+rules实现多选行权限方式(级联效果)
2020/04/07 Python
使用bandit对目标python代码进行安全函数扫描的案例分析
2021/01/27 Python
html5通过postMessage进行跨域通信的方法
2017/12/04 HTML / CSS
澳大利亚领先的睡衣品牌:Peter Alexander
2016/08/16 全球购物
全球最大的中文旅行网站:去哪儿网
2017/11/16 全球购物
《理想》教学反思
2014/02/17 职场文书
企业宣传方案
2014/03/04 职场文书
英语专业职业生涯规划范文
2014/03/05 职场文书
博士生求职信
2014/07/06 职场文书
个人先进事迹材料
2014/12/29 职场文书
中学生社会实践教育活动总结
2015/05/06 职场文书
Java面试题冲刺第十八天--Spring框架3
2021/08/07 面试题
7个关于Python的经典基础案例
2021/11/07 Python