使用flas提供从python到HTML的多个更新

2024-09-28 05:24:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试为我的python程序构建一个基于web的用户界面。为此,我希望将dataFrameFinal的实时更新发送到html页面,但是每次提交表单时,我只能从Flask发送一次更新。你知道吗

目前在我的主.py我有这个功能

@app.route('/process', methods=['POST'])
def process():

    # gets the number of sims from the form on submit
    numSims = int(request.form['numSims'])

    dataFrameFinal = runSims(num_sims=numSims)

    return jsonify({'dataframe' : dataFrameFinal .reset_index().to_html()})

这将得到表单提交时的sim数(numSims),并在所有模拟运行到javascript文件后返回表,javascript文件将结果加载到html页面。你知道吗

然而,由于我正在运行超过10000个sims(运行可能需要10分钟以上),我希望发送dataFrameFinal的实时版本(例如每10个sims发送一次html页面的更新)。如果您能给我一些建议,我将不胜感激。你知道吗

抱歉,如果这是一个基本的问题,我对这个非常新,找不到任何其他类似的职位,所以我想我会问。提前谢谢。你知道吗


Tags: 文件the程序formwebflask表单html
1条回答
网友
1楼 · 发布于 2024-09-28 05:24:56

使用任务管理器

Celery是一个广泛使用的选项,尽管还有其他选项。你知道吗

使用芹菜可以从视图函数启动异步(或后台)任务/进程。然后,您的视图可以向用户返回一个响应(这样用户就不必等待所有的处理完成之后才能看到响应)。你知道吗

芹菜需要一个消息代理来启动任务并返回结果。(More details.)您还可以使用此代理存储进度更新。你知道吗

例如,如果您正在使用Redis,当runSims()处理了100个sim时,您可以在Redis中存储类似processed: 100的内容。然后,您可以编写一个Flask view函数从Redis中读取这个值并将其返回给用户。实时更新页面的一个选项是在页面上有一些Javascript,每秒调用Flask view函数。Flask view函数将读取Redis中当前存储的任何数字(您的芹菜任务/进程应该更新该数字),并将其返回到Javascript,以便更新页面上的某些字段。你知道吗

您的流程函数最终将如下所示:

@app.route('/process', methods=['POST'])
def process():

    # gets the number of sims from the form on submit
    numSims = int(request.form['numSims'])

    # Start the celery task
    runSims.apply_async(num_sims=numSims)

    # Let the user know that processing has started
    return 'Your task has started processing. Stay on the page for live updates.'

您的get_progress()函数可能如下所示:

import redis

r = redis.StrictRedis()

@app.route('/progress', methods=['GET'])
def progress():
    return r.get('processed')

相关问题 更多 >

    热门问题