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实现的监测服务器硬盘使用率脚本分享
Nov 07 Python
Python实现的飞速中文网小说下载脚本
Apr 23 Python
Python在图片中添加文字的两种方法
Apr 29 Python
对pandas中Series的map函数详解
Jul 25 Python
基于python3抓取pinpoint应用信息入库
Jan 08 Python
Python selenium 自动化脚本打包成一个exe文件(推荐)
Jan 14 Python
Python获取、格式化当前时间日期的方法
Feb 10 Python
Pycharm中import torch报错的快速解决方法
Mar 05 Python
Python列表切片常用操作实例解析
Mar 10 Python
python实现图像拼接功能
Mar 23 Python
Python configparser模块操作代码实例
Jun 08 Python
python 爬虫如何实现百度翻译
Nov 16 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
PHP5 安装方法
2007/01/15 PHP
PHP curl模拟浏览器采集阿里巴巴的实现代码
2011/04/20 PHP
ThinkPHP权限认证Auth实例详解
2014/07/22 PHP
PHP根据两点间的经纬度计算距离
2014/10/31 PHP
PHP异常处理浅析
2015/05/12 PHP
正确的PHP匹配UTF-8中文的正则表达式
2015/05/13 PHP
PHP基于MySQLI函数封装的数据库连接工具类【定义与用法】
2017/08/11 PHP
PHP常见过waf webshell以及最简单的检测方法
2019/05/21 PHP
js 鼠标拖动对象 可让任何div实现拖动效果
2009/11/09 Javascript
window.js 主要包含了页面的一些操作
2009/12/23 Javascript
按下Enter焦点移至下一个控件的实现js代码
2013/12/11 Javascript
JS 在指定数组中随机取出N个不重复的数据
2014/06/10 Javascript
jQuery图片切换插件jquery.cycle.js使用示例
2014/06/16 Javascript
jQuery中的编程范式详解
2014/12/15 Javascript
JavaScript获取伪元素(Pseudo-Element)属性的方法技巧
2015/03/13 Javascript
Jquery中使用show()与hide()方法动画显示和隐藏图片
2015/10/08 Javascript
理解Javascript图片预加载
2016/02/23 Javascript
ThinkJS中如何使用MongoDB的CURD操作
2016/12/13 Javascript
JS正则匹配中文的方法示例
2017/01/06 Javascript
jQuery插件zTree实现单独选中根节点中第一个节点示例
2017/03/08 Javascript
浅析Vue中method与computed的区别
2018/03/06 Javascript
详解Vue中数组和对象更改后视图不刷新的问题
2018/09/21 Javascript
Python提取网页中超链接的方法
2016/09/18 Python
使用python将请求的requests headers参数格式化方法
2019/01/02 Python
Python3实现的简单工资管理系统示例
2019/03/12 Python
ipython jupyter notebook中显示图像和数学公式实例
2020/04/15 Python
三步解决python PermissionError: [WinError 5]拒绝访问的情况
2020/04/22 Python
浅析python 动态库m.so.1.0错误问题
2020/05/09 Python
新闻专业个人自我评价
2013/09/21 职场文书
基层工作经历证明
2014/01/13 职场文书
机械设计及其自动化专业求职信
2014/06/09 职场文书
物业保洁员岗位职责
2015/02/13 职场文书
故意杀人罪辩护词
2015/05/21 职场文书
大学生入党群众意见书
2015/06/02 职场文书
2016猴年开门红标语口号
2015/12/26 职场文书
sql server删除前1000行数据的方法实例
2021/08/30 SQL Server