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连接MySQL、MongoDB、Redis、memcache等数据库的方法
Nov 15 Python
linux系统使用python监测网络接口获取网络的输入输出
Jan 15 Python
Python实现简单的HttpServer服务器示例
Sep 25 Python
Python图形绘制操作之正弦曲线实现方法分析
Dec 25 Python
Django使用httpresponse返回用户头像实例代码
Jan 26 Python
Python+PIL实现支付宝AR红包
Feb 09 Python
Python实现扣除个人税后的工资计算器示例
Mar 26 Python
Python3之简单搭建自带服务器的实例讲解
Jun 04 Python
在Python中利用pickle保存变量的实例
Dec 30 Python
Jupyter notebook如何修改平台字体
May 13 Python
在django中form的label和verbose name的区别说明
May 20 Python
python爬虫要用到的库总结
Jul 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
DedeCms模板安装/制作概述
2007/03/11 PHP
PHP 定界符 使用技巧
2009/06/14 PHP
php中$_SERVER[PHP_SELF] 和 $_SERVER[SCRIPT_NAME]之间的区别
2009/09/05 PHP
PHP中文URL编解码(urlencode()rawurlencode()
2010/07/03 PHP
Laravel框架实现发送短信验证功能代码
2016/06/06 PHP
thinkphp5实现无限级分类
2019/02/18 PHP
JS解密入门之凭直觉解
2008/06/25 Javascript
自动完成JS类(纯JS, Ajax模式)
2009/03/12 Javascript
JavaScript 利用StringBuffer类提升+=拼接字符串效率
2009/11/24 Javascript
理解JSON:3分钟课程
2011/10/28 Javascript
鼠标选择动态改变网页背景颜色的JS代码
2013/12/10 Javascript
JavaScript的各种常见函数定义方法
2014/09/16 Javascript
jQuery内部原理和实现方式浅析
2015/02/03 Javascript
由浅入深讲解Javascript继承机制与simple-inheritance源码分析
2015/12/13 Javascript
jQuery实现ajax的叠加和停止(终止ajax请求)
2016/08/08 Javascript
JavaScript“尽快失败”的原则实例详解
2016/10/08 Javascript
Node.js  REPL (交互式解释器)实例详解
2017/08/06 Javascript
Cookbook组件形式:优化 Vue 组件的运行时性能
2018/11/25 Javascript
js实现微信聊天效果
2020/08/09 Javascript
vue 避免变量赋值后双向绑定的操作
2020/11/07 Javascript
Vue 3.0中jsx语法的使用
2020/11/13 Javascript
[36:13]Mineski vs iG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python实现目录树生成示例
2014/03/28 Python
python实现学生管理系统
2018/01/11 Python
Python subprocess模块详细解读
2018/01/29 Python
解决Python二维数组赋值问题
2019/11/28 Python
Python中 Global和Nonlocal的用法详解
2020/01/20 Python
python通过文本在一个图中画多条线的实例
2020/02/21 Python
Django之choices选项和富文本编辑器的使用详解
2020/04/01 Python
Python+Selenium实现自动化的环境搭建的步骤(图文)
2020/09/01 Python
黄金酒广告词
2014/03/21 职场文书
教师岗位职责范本
2015/04/02 职场文书
售后前台接待岗位职责
2015/04/03 职场文书
在酒桌上的敬酒词
2015/08/12 职场文书
基于Go Int转string几种方式性能测试
2021/04/28 Golang
一文解答什么是MySQL的回表
2022/08/05 MySQL