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執行了,這時可以點擊查看任務進行查看。

 

 

項目源代碼下載

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM