Django Django-Celery 进度条

Django Django-Celery 进度条

在本文中,我们将介绍 DjangoDjango-Celery 进度条的使用方法。我们会详细介绍如何在 Django 项目中集成 Celery,并通过进度条来展示任务的进度。

阅读更多:Django 教程

什么是 Django?什么是 Django-Celery?

Django 是一个使用 Python 编写的开源网络应用框架,它遵循了 MTV(模型-模板-视图)的设计模式。Django 提供了一套强大的工具和库,帮助开发者快速构建高效的 Web 应用。

Celery 是一个基于分布式消息传递的任务队列,它可以和 Django 紧密集成,提供了高效的任务处理和分布式运算能力。Django-Celery 则是 Django 的 Celery 扩展,为我们提供了更便捷的任务管理和调度。

安装和配置 Django-Celery

首先,我们需要安装 Celery 和 Django-Celery:

$ pip install celery django-celery
Python

接着,在 Django 项目的 settings.py 文件中做如下配置:

INSTALLED_APPS = [
    ...
    'djcelery',
    ...
]

CELERY_BROKER_URL = 'amqp://guest:guest@localhost:5672//'
CELERY_RESULT_BACKEND = 'db+sqlite:///results.sqlite'

import djcelery
djcelery.setup_loader()
Python

在这里,我们把 djcelery 添加到 INSTALLED_APPS 中,并配置了 Celery 的消息队列和结果后端。

创建一个进度条任务

我们首先需要创建一个 Django-Celery 进度条任务。在 Django 项目中创建一个 tasks.py 文件,然后定义我们的任务函数:

from celery import task
from celery_progress.backend import ProgressRecorder

@task(bind=True)
def process_data(self, data):
    progress_recorder = ProgressRecorder(self)
    for item in data:
        # 处理数据
        progress_recorder.set_progress(item, len(data))
    return 'Task complete'
Python

在这里,我们使用了 celerytask 装饰器来定义任务函数。然后,我们创建了一个 ProgressRecorder 对象,它会记录任务的进度。在任务的执行过程中,我们通过调用 set_progress 方法来更新进度条。

显示进度条

为了在前端界面中显示进度条,我们需要使用 jQuery 或其他前端库来定期查询任务的进度,并实时更新显示。以下是一个简单的例子:

function poll_progress() {
    .ajax({
        url: '/progress/',
        method: 'GET',
        success: function (data) {
            var progress = parseInt(data["progress"]);
            var total = parseInt(data["total"]);
            var percentage = (progress / total * 100).toFixed(2) + "%";('#progress-bar').css('width', percentage).text(percentage);
            if (progress < total) {
                setTimeout(poll_progress, 1000);
            }
        }
    });
}

$(document).ready(function () {
    poll_progress();
});
JavaScript

在这个例子中,我们通过发送 GET 请求到 /progress/ 接口来获取任务的进度。然后,根据返回的进度信息,更新前端界面中的进度条元素。

集成进度条到 Django 项目

为了将进度条集成到 Django 项目中,我们需要创建一个 API 视图来返回任务的进度信息。在 Django 项目中创建一个 views.py 文件,然后定义如下视图:

from django.http import JsonResponse
from djcelery.models import TaskMeta

def progress_view(request):
    task_id = request.GET.get('task_id')
    if task_id:
        task = TaskMeta.objects.get(task_id=task_id)
        response_data = {
            'progress': task.result['progress'],
            'total': task.result['total']
        }
        return JsonResponse(response_data)
    else:
        return JsonResponse({})
Python

在这里,我们查询了指定任务ID的任务对象,并返回任务的进度信息。如果没有指定任务ID,则返回一个空的 JSON 响应。

接下来,我们需要将这个视图添加到 Django 项目的 URL 配置中。在项目的 urls.py 文件中添加如下代码:

from django.urls import path
from .views import progress_view

urlpatterns = [
    ...
    path('progress/', progress_view, name='progress'),
    ...
]
Python

运行任务和展示进度条

现在,我们已经完成了 Django-Celery 进度条的配置和集成。接下来,我们使用以下代码来运行任务并展示进度条:

from .tasks import process_data

def run_task(request):
    data = [1, 2, 3, 4, 5]  # 假设这是要处理的数据
    task = process_data.delay(data)
    return render(request, 'task.html', {'task_id': task.id})
Python

在这里,我们导入了之前创建的任务函数 process_data,然后在视图函数 run_task 中调用它。我们将处理的数据传递给任务,并且把任务的 ID 返回给前端界面。

然后,我们可以在前端界面中使用以下代码来展示进度条:

<!DOCTYPE html>
<html>
<head>
    <title>任务进度</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
    <div id="progress-bar-container">
        <div id="progress-bar"></div>
    </div>
    <script>
        function poll_progress() {
            .ajax({
                url: '/progress/',
                method: 'GET',
                data: {
                    task_id: '{{task_id}}'
                },
                success: function (data) {
                    var progress = parseInt(data["progress"]);
                    var total = parseInt(data["total"]);
                    var percentage = (progress / total * 100).toFixed(2) + "%";('#progress-bar').css('width', percentage).text(percentage);
                    if (progress < total) {
                        setTimeout(poll_progress, 1000);
                    }
                }
            });
        }

        $(document).ready(function () {
            poll_progress();
        });
    </script>
</body>
</html>
HTML

在这个例子中,我们使用了 Django 模板语言来动态地获取任务的 ID。然后,我们通过前端脚本来定期查询任务的进度,并实时更新显示进度条。

总结

本文介绍了如何使用 Django-Celery 进度条来展示任务的进度。我们首先安装并配置了 Django-Celery,然后创建了一个进度条任务和一个 API 视图来获取任务的进度信息。最后,我们展示了如何在前端界面中使用 jQuery 来展示进度条,并实时更新任务的进度。

通过使用 Django-Celery 进度条,我们可以更好地监控和管理后台任务的执行进度,提高开发效率和用户体验。希望本文对你理解和使用 Django-Celery 进度条有所帮助!

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册