zoukankan      html  css  js  c++  java
  • Django集成celery实战小项目

    上一篇已经介绍了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执行了,这时可以点击查看任务进行查看。

    项目源代码下载

  • 相关阅读:
    SilverLight入门实例(一)
    应聘成功了,要去沪江网上班啦!
    C#中(int)、int.Parse()、int.TryParse、Convert.ToInt32数据转换注意事项
    DataTable和DataSet什么区别
    SQL 通配符
    可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL)
    发现jquery库的关键字冲突,造成了隐形BUG!(附代码)
    《转载》微软PostScirpt打印机驱动程序原理
    在应聘工作中,不知不觉的完成了一个比较困难的小项目
    在最新的Eclipse 3.6 上配置 Java ME 的开发环境!
  • 原文地址:https://www.cnblogs.com/mysql-dba/p/6895190.html
Copyright © 2011-2022 走看看