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

yipeiwu_com5年前Python基础

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

本系列文章的开发环境:

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

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

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

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

    

二、项目结构

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

    

三、开始编程

   1、安装django-celery:  

$ pip install django-celery

   2、新建django工程项目test_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

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

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创建ArcGIS shape文件的实现

工作中遇到了一个需求,需要把一段json文本转化成ArcGIS shape文件,想来想去,还是考虑用python来实现。 直接上代码 import shapefile import...

python中验证码连通域分割的方法详解

实现思路 是用深度遍历,对图片进行二值化处理,先找到一个黑色像素,然后对这个像素的周围8个像素进行判断,如果没有访问过,就保存起来,然后最后这个数组的最小x和最大x就是x轴上的切割位置。...

攻击者是如何将PHP Phar包伪装成图像以绕过文件类型检测的(推荐)

攻击者是如何将PHP Phar包伪装成图像以绕过文件类型检测的(推荐)

在US BlackHat 2018大会上,安全人员证明,攻击者不仅可以利用PHAR包发动RCE攻击,而且,通过调整其二进制内容,他们还可以将其伪装成一幅图像,从而绕过安全检查。 在本文中...

ubuntu上安装python的实例方法

怎么在ubuntu安装python? python在ubuntu下有几种安装方法: ● 通过ubuntu官方的apt工具包安装 ● 通过PPA(Personal Package Arch...

Python3.4学习笔记之列表、数组操作示例

本文实例讲述了Python3.4列表、数组操作。分享给大家供大家参考,具体如下: python列表,数组类型要相同,python不需要指定数据类型,可以把各种类型打包进去 python列...