上一篇已经介绍了 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 执行了,这时可以点击查看任务进行查看。
项目源代码下载
来源: http://www.92to.com/bangong/2017/05-25/22238393.html