Python异步处理返回进度——使用Flask实现进度条

本文将详细讲解如何使用 Flask 框架实现 Python 异步处理返回进度,并对进度进行可视化展示,以进度条形式向用户展示异步处理的进度。本文将分为两个部分来讲解,第一部分将介绍如何使用 Flask 实现异步处理并返回进度,第二部分将介绍如何使用 JavaScript 和 Bootstrap 实现进度条。

第一部分:Flask 实现异步处理返回进度

1. 准备工作

我们首先需要安装 Flask 和 Celery,你可以使用 pip 命令来安装,如下所示:

pip install flask celery

2. 建立 Flask 应用

在 Flask 中使用异步处理需要使用 Celery 库,因此我们需要在应用中初始化 Celery。我们可以使用如下代码来初始化 Celery:

from celery import Celery
from flask import Flask

app = Flask(__name__)
app.config['CELERY_BROKER_URL'] = 'redis://localhost:6379',
app.config['CELERY_RESULT_BACKEND'] = 'redis://localhost:6379'

celery = Celery(
    app.name,
    broker=app.config['CELERY_BROKER_URL'],
    backend=app.config['CELERY_RESULT_BACKEND']
)
celery.conf.update(app.config)

在上面的代码中,我们使用了 Redis 作为消息队列,因此需要安装 Redis 并启动 Redis 服务。如果你使用的是其他消息队列,例如 RabbitMQ,也可以在上面的代码中进行配置。

3. 实现异步任务

现在我们来实现异步任务,下面是一个简单的异步任务的代码:

import time
from celery import Celery

celery = Celery('tasks', broker='redis://localhost:6379', backend='redis://localhost:6379')

@celery.task(bind=True)
def long_task(self):
    """Background task that runs a long function with progress reports."""
    verb = ['Starting up', 'Booting', 'Repairing', 'Loading', 'Checking']
    adjective = ['master', 'radiant', 'silent', 'harmonic', 'fast']
    noun = ['solar array', 'particle reshaper', 'cosmic ray', 'orbiter', 'bit']
    message = ''
    total = 100

    for i in range(total):
        if not message or i % 3 == 0 or i == total - 1:
            message = f'{random.choice(verb)} {random.choice(adjective)} {random.choice(noun)}...'
        self.update_state(state='PROGRESS',
                          meta={'current': i, 'total': total, 'status': message})
        time.sleep(1)
    return {'current': 100, 'total': 100, 'status': 'Task completed!', 'result': 42}

在上面的代码中,我们定义了一个名为 long_task 的异步任务,该任务会模拟一个长时间运行的进程,并会每秒返回一次运行进度。在每次更新进度的时候,我们会使用 self.update_state() 方法来更新异步任务的状态。

4. 建立路由

现在我们需要建立一个路由来启动异步任务,并将异步任务的进度发送给客户端。下面是路由的代码:

from ..tasks import long_task

@app.route('/longtask', methods=['POST'])
def longtask():
    task = long_task.delay()
    return jsonify({}), 202, {'Location': url_for('taskstatus', task_id=task.id)}

@app.route('/status/<task_id>')
def taskstatus(task_id):
    task = long_task.AsyncResult(task_id)
    if task.state == 'PENDING':
        # Job did not start yet
        response = {
            'state': task.state,
            'current': 0,
            'total': 1,
            'status': 'Pending...'
        }
    elif task.state != 'FAILURE':
        # Job is running
        response = {
            'state': task.state,
            'current': task.info.get('current', 0),
            'total': task.info.get('total', 1),
            'status': task.info.get('status', '')
        }
        if 'result' in task.info:
            response['result'] = task.info['result']
    else:
        # Job failed
        response = {
            'state': task.state,
            'current': 1,
            'total': 1,
            'status': str(task.info)
        }

    return jsonify(response)

在上面的代码中,我们建立了两个路由,第一个路由是用来启动异步任务的,它会返回一个 202 Accepted 响应,表示任务已经被接受,但尚未完成。在该路由处理函数中,我们调用 long_task.delay() 方法来启动异步任务,并将任务 ID 保存在响应头的 Location 字段中,客户端可以使用这个 URL 检查任务的状态。

第二个路由用来返回异步任务的状态。我们首先使用任务 ID 获取任务对象,然后检查任务的状态。如果任务还没有开始,我们将返回一个状态为 PENDING 的响应。如果任务正在运行,我们返回当前任务的进度和状态。如果任务已经完成,我们返回状态为 SUCCESS,并且包含任务最终的结果。

第二部分:使用 JavaScript 和 Bootstrap 实现进度条

在本部分中,我们将使用 JavaScript 和 Bootstrap 来实现进度条。我们需要在客户端向服务器发送 HTTP 请求来获取异步任务的状态,并将异步任务的进度可视化展示。

1. 发送 HTTP 请求

我们可以使用 jQuery 来向服务器发送 HTTP 请求,并且定期检查异步任务的状态。下面是向服务器发送 HTTP 请求的代码:

function update_progress() {
    $.getJSON('{{ url_for('taskstatus', task_id=task_id) }}', function(data) {
        var percentage = Math.floor(data.current / data.total * 100);
        $('.progress-bar').css('width', percentage + '%');
        $('.progress-bar').text(percentage + '%');
        if (data.state != 'SUCCESS' && data.state != 'FAILURE') {
            setTimeout(update_progress, 1000);
        }
    });
}

在上面的代码中,我们首先使用 $.getJSON() 方法向服务器发送 HTTP 请求,并获取异步任务的状态。然后我们使用异步任务的进度计算百分比,并更新进度条的宽度和文本。

如果任务还没有完成,我们将使用 JavaScript 的 setTimeout() 方法定期检查任务的状态,以获取最新的进度信息。

2. 初始化进度条

在页面加载后,我们需要初始化进度条的状态。下面是初始化进度条的代码:

$(document).ready(function() {
    update_progress();
});

在上面的代码中,我们使用了 jQuery 的 $(document).ready() 方法,在页面加载完成后调用 update_progress() 函数来初始化进度条的状态。

3. HTML 代码

下面是包含进度条的 HTML 代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Long Task</title>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
</head>
<body>
<div class="container">
    <h1>Long Task</h1>
    <div class="progress">
        <div class="progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">
            0%
        </div>
    </div>
</div>
<script>
    var task_id = '{{ task_id }}';
    function update_progress() {
        $.getJSON('{{ url_for('taskstatus', task_id=task_id) }}', function(data) {
            var percentage = Math.floor(data.current / data.total * 100);
            $('.progress-bar').css('width', percentage + '%');
            $('.progress-bar').text(percentage + '%');
            if (data.state != 'SUCCESS' && data.state != 'FAILURE') {
                setTimeout(update_progress, 1000);
            }
        });
    }
    $(document).ready(function() {
        update_progress();
    });
</script>
</body>
</html>

在上面的代码中,我们首先引入了 Bootstrap 的 CSS 文件和 jQuery 库,并定义了包含进度条的 HTML 代码。我们使用 Flask 的 url_for() 函数来动态生成路由 URL,并通过 JavaScript 设置了任务 ID。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python异步处理返回进度——使用Flask实现进度条 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • 详解Python的Flask框架中生成SECRET_KEY密钥的方法

    Flask 是一个使用 Python 编写的轻量级 Web 开发框架。在使用 Flask 开发 Web 应用时,通常需要生成 SECRET_KEY 密钥用于加密 Cookies、Session 等数据。以下是详解 Flask 生成 SECRET_KEY 密钥的方法。 方法一:使用 Flask 自带的生成密钥方法 在 Flask 中,可以使用 os.urand…

    Flask 2023年5月16日
    00
  • flask框架蓝图和子域名配置详解

    下面是详细讲解“flask框架蓝图和子域名配置详解”的完整攻略。 什么是蓝图 蓝图(blueprint)是Flask程序中的一个可重用组件,它让一个应用可以更好地组织代码。通过将应用的路由和处理函数分组,蓝图可以更好地为大型和组织良好的应用程序提供支持。 蓝图还可以通过其他方式增强应用程序。例如,我们可以使用蓝图来处理静态文件和模板。 蓝图对象是由 Flas…

    Flask 2023年5月15日
    00
  • Python库 Bokeh 数据可视化实用指南

    下面我为您详细讲解“Python库 Bokeh 数据可视化实用指南”的完整攻略。 Python库 Bokeh 数据可视化实用指南 什么是 Bokeh? Bokeh是一个用于Python编程语言的交互式数据可视化库。它可以帮助用户通过美观、灵活的图表来呈现大数据集、实时流数据以及复杂的统计数据。Bokeh提供了多种绘图选项,包括线状图、条形图、散点图、热力图等…

    Flask 2023年5月16日
    00
  • Flask中endpoint的理解(小结)

    Flask中的endpoint是指一个可重用的处理程序,以及与之关联的URL规则。Flask应用程序中的每个视图函数都可以被赋予一个endpoint,这个endpoint可以通过url_for()函数在应用程序中的任何地方进行访问。在下面的文本中,我们将详细讲解Flask中endpoint的理解,包括其作用以及使用方法。 作用 Flask的endpoint主…

    Flask 2023年5月15日
    00
  • flask实现python方法转换服务的方法

    实现python方法转换服务主要涉及以下几个步骤: 安装Flask Flask是一个轻量级的Python Web框架,可以用来搭建Web应用程序。安装Flask可以使用pip命令: pip install flask 创建Flask应用 首先,我们需要创建一个简单的Flask应用。通过以下代码,可以得到一个极简的Flask应用: from flask imp…

    Flask 2023年5月15日
    00
  • Python Flask前后端Ajax交互的方法示例

    这里是关于“Python Flask前后端Ajax交互的方法示例”的完整攻略: 1. 简介 Flask是一个轻量级的Web框架,常被用于快速构建Web应用程序。在Web应用程序中,我们经常需要使用Ajax技术来实现前后端数据交互。本文将介绍使用Flask框架实现前后端Ajax交互的方法。 2. 示例一:实现前后端Ajax交互 2.1 准备工作 首先,我们需要…

    Flask 2023年5月15日
    00
  • Flask中Cookie和Session理解与作用介绍

    Flask中的Cookie和Session是处理Web应用程序认证和授权的两种重要机制。本文将详细讲解Flask中Cookie和Session的理解与作用,并介绍它们的具体应用。 1. Flask中的Cookie 1.1 Cookie的介绍 Cookie是存储在客户端的小型文本文件,由服务器提供,在服务器和浏览器之间传递。Cookie通常用于内容管理系统的用…

    Flask 2023年5月15日
    00
  • Flask框架URL管理操作示例【基于@app.route】

    下面我将为您详细讲解”Flask框架URL管理操作示例【基于@app.route】”的完整攻略,其中包括两条示例说明。 Flask框架URL管理操作示例【基于@app.route】 在Flask框架中,基于@app.route装饰器可以实现对URL的管理操作。使用这个装饰器,我们可以非常方便地指定URL地址,并将其与相应的函数绑定起来。下面是两个具体的示例:…

    Flask 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部