Django Django-Celery 进度条
在本文中,我们将介绍 Django 和 Django-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
接着,在 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()
在这里,我们把 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'
在这里,我们使用了 celery
的 task
装饰器来定义任务函数。然后,我们创建了一个 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();
});
在这个例子中,我们通过发送 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({})
在这里,我们查询了指定任务ID的任务对象,并返回任务的进度信息。如果没有指定任务ID,则返回一个空的 JSON 响应。
接下来,我们需要将这个视图添加到 Django 项目的 URL 配置中。在项目的 urls.py
文件中添加如下代码:
from django.urls import path
from .views import progress_view
urlpatterns = [
...
path('progress/', progress_view, name='progress'),
...
]
运行任务和展示进度条
现在,我们已经完成了 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})
在这里,我们导入了之前创建的任务函数 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>
在这个例子中,我们使用了 Django 模板语言来动态地获取任务的 ID。然后,我们通过前端脚本来定期查询任务的进度,并实时更新显示进度条。
总结
本文介绍了如何使用 Django-Celery 进度条来展示任务的进度。我们首先安装并配置了 Django-Celery,然后创建了一个进度条任务和一个 API 视图来获取任务的进度信息。最后,我们展示了如何在前端界面中使用 jQuery 来展示进度条,并实时更新任务的进度。
通过使用 Django-Celery 进度条,我们可以更好地监控和管理后台任务的执行进度,提高开发效率和用户体验。希望本文对你理解和使用 Django-Celery 进度条有所帮助!