Django集成Celery实现异步任务处理实战

半杯拿铁
半杯拿铁
发布时间:2026-10-13| 3人浏览过
原创

本文通过一个加法计算的小项目,详细演示如何在Django框架中集成Celery以解决长时间后台处理阻塞HTTP请求的问题。内容涵盖环境配置、项目结构设计、Broker与Backend选择、代码编写及Worker启动步骤,旨在提升Web应用的用户体验。

前文已介绍Celery的基础知识,本文将通过一个具体小项目,详细阐述如何在Django框架中集成Celery进行开发。

本系列文章所基于的开发环境如下:

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

在Web应用中,当用户触发某个操作时,后台处理程序可能需要较长时间才能返回结果。为了避免阻塞HTTP请求并提升用户体验,我们需要解决这一等待问题。本例的设计方案是:提供两个网页界面,一个用于提交加法计算任务至后台执行;另一个用于查看各项计算任务的详细信息,包括任务ID和当前状态等。

效果如下图所示,访问地址为:http://127.0.0.1:8000/index/

点击“查看任务”链接,即可浏览所有任务的执行状态:其中“success”表示执行成功,“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 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。