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使用chardet判断字符编码
May 09 Python
python调用java的jar包方法
Dec 15 Python
搞定这套Python爬虫面试题(面试会so easy)
Apr 03 Python
Ubuntu+python将nii图像保存成png格式
Jul 18 Python
python matplotlib库绘制条形图练习题
Aug 10 Python
python PyQt5/Pyside2 按钮右击菜单实例代码
Aug 17 Python
Python实现线性插值和三次样条插值的示例代码
Nov 13 Python
Python实现Wordcloud生成词云图的示例
Mar 30 Python
keras load model时出现Missing Layer错误的解决方式
Jun 11 Python
python3.7.3版本和django2.2.3版本是否可以兼容
Sep 01 Python
python中append函数用法讲解
Dec 11 Python
使用numpngw和matplotlib生成png动画的示例代码
Jan 24 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电台频率大全 - 30 宁夏回族自治区
2020/03/11 无线电
深入php之规范编程命名小结
2013/05/15 PHP
PHP基于文件存储实现缓存的方法
2015/07/20 PHP
用javascript动态调整iframe高度的代码
2007/04/10 Javascript
jquery复选框CHECKBOX全选、反选
2008/08/30 Javascript
javascript showModalDialog 内跳转页面的问题
2010/11/25 Javascript
cnblogs 代码高亮显示后的代码复制问题解决实现代码
2011/12/14 Javascript
js弹出模式对话框,并接收回传值的方法
2013/03/12 Javascript
javascript中parentNode,childNodes,children的应用详解
2013/12/17 Javascript
Jquery节点遍历next与nextAll方法使用示例
2014/07/22 Javascript
JavaScript通过字符串调用函数的实现方法
2015/03/18 Javascript
Javascript中typeof 用法小结
2015/05/12 Javascript
JS中call/apply、arguments、undefined/null方法详解
2016/02/15 Javascript
javascript下使用Promise封装FileReader
2016/02/19 Javascript
jQuery常用的一些技巧汇总
2016/03/26 Javascript
Javascript 6里的4个新语法
2016/08/25 Javascript
weUI应用之JS常用信息提示弹层的封装
2016/11/21 Javascript
基于vue2的table分页组件实现方法
2017/03/20 Javascript
原生JS实现不断变化的标签
2017/05/22 Javascript
Vue 自定义动态组件实例详解
2018/03/28 Javascript
微信小程序基于canvas渐变实现的彩虹效果示例
2019/05/03 Javascript
在Vue mounted方法中使用data变量详解
2019/11/05 Javascript
[01:01:51]EG vs VG Supermajor小组赛B组 BO3 第二场 6.2
2018/06/03 DOTA
Python中常见的异常总结
2018/02/20 Python
python+pyqt5实现图片批量缩放工具
2019/03/18 Python
Python 经典算法100及解析(小结)
2019/09/13 Python
python线程信号量semaphore使用解析
2019/11/30 Python
pytorch加载自己的图像数据集实例
2020/07/07 Python
python接口自动化框架实战
2020/12/23 Python
pycharm 快速解决python代码冲突的问题
2021/01/15 Python
英国屋顶用品和材料超市:Roofing Supplies UK
2019/08/24 全球购物
Ibatis中如何提高SQL Map的性能
2013/05/11 面试题
《猫》教学反思
2014/02/26 职场文书
会计核算科岗位职责
2014/03/19 职场文书
《骑牛比赛》教后反思
2014/04/22 职场文书
民间借贷纠纷起诉书
2015/08/03 职场文书