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 相关文章推荐
详解Python3操作Mongodb简明易懂教程
May 25 Python
Python使用Scrapy保存控制台信息到文本解析
Dec 27 Python
python 通过logging写入日志到文件和控制台的实例
Apr 28 Python
查看django版本的方法分享
May 14 Python
Python中if elif else及缩进的使用简述
May 31 Python
python调用c++ ctype list传数组或者返回数组的方法
Feb 13 Python
Python常用爬虫代码总结方便查询
Feb 25 Python
Django 简单实现分页与搜索功能的示例代码
Nov 07 Python
pytorch 利用lstm做mnist手写数字识别分类的实例
Jan 10 Python
K最近邻算法(KNN)---sklearn+python实现方式
Feb 24 Python
python爬虫基础知识点整理
Jun 02 Python
浅谈numpy中函数resize与reshape,ravel与flatten的区别
Jun 18 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
德生BCL3000的电路分析和打磨
2021/03/02 无线电
用Simple Excel导出xls实现方法
2012/12/06 PHP
Yii框架表单模型和验证用法
2016/05/20 PHP
php实现xml与json之间的相互转换功能实例
2016/07/07 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
PHP使用标准库spl实现的观察者模式示例
2018/08/04 PHP
Ext JS Grid在IE6 下宽度的问题解决方法
2009/02/15 Javascript
深入理解JSON数据源格式
2014/01/10 Javascript
jquery使用hide方法隐藏指定id的元素
2015/03/30 Javascript
JQuery显示隐藏DIV的方法及代码实例
2015/04/16 Javascript
基于jquery步骤进度条源码分享
2015/11/12 Javascript
JS闭包、作用域链、垃圾回收、内存泄露相关知识小结
2016/05/16 Javascript
vue.js+boostrap项目实践(案例详解)
2016/09/21 Javascript
jquery实现点击页面回到顶部
2016/11/23 Javascript
详解数组Array.sort()排序的方法
2020/05/09 Javascript
jquery处理checkbox(复选框)是否被选中实例代码
2017/06/12 jQuery
javascript实现电脑和手机版样式切换
2017/11/10 Javascript
JS中图片压缩的方法小结
2017/11/14 Javascript
vue 解决addRoutes动态添加路由后刷新失效问题
2018/07/02 Javascript
JS变量提升原理与用法实例浅析
2020/05/22 Javascript
Vue+penlayers实现多边形绘制及展示
2020/12/24 Vue.js
[13:21]DOTA2国际邀请赛采访专栏:RSnake战队国士无双,Fnatic.Fly
2013/08/06 DOTA
Python变量赋值的秘密分享
2018/04/03 Python
Python面向对象基础入门之编码细节与注意事项
2018/12/11 Python
浅谈python3发送post请求参数为空的情况
2018/12/28 Python
python DataFrame 取差集实例
2019/01/30 Python
Python获取命令实时输出-原样彩色输出并返回输出结果的示例
2019/07/11 Python
python读取.mat文件的数据及实例代码
2019/07/12 Python
解决Python列表字符不区分大小写的问题
2019/12/19 Python
浅谈python 调用open()打开文件时路径出错的原因
2020/06/05 Python
基于Python-turtle库绘制路飞的草帽骷髅旗、美国队长的盾牌、高达的源码
2021/02/18 Python
经济信息管理专业大学生求职信
2013/09/27 职场文书
精彩的推荐信范文
2013/11/26 职场文书
大队干部竞选演讲稿
2014/04/28 职场文书
终止劳动合同证明书样本
2014/11/19 职场文书
PostgreSQL自动更新时间戳实例代码
2021/11/27 PostgreSQL