【问题标题】:How to invoke python/flask server to reload client page from server-side function?如何调用 python/flask 服务器从服务器端函数重新加载客户端页面?
【发布时间】:2015-11-18 10:50:11
【问题描述】:

我正在开发一个小型 python/flask 项目,该项目将繁重的计算例程与浏览器界面连接起来。出于实际原因,我必须将计算保留在后台进程中,并在计算完成后重新加载/重定向页面(带有输出结果)。以下是我目前所拥有的最小代码(以相反的顺序):

interface.py

from flask import Flask
from threading import Thread
import time
app = Flask(__name__)

# step 4: rerender browser with output data
@app.route('/done')
def done(data_to_pass):
    # rerender browser's html here?
    print data_to_pass
    return data_to_pass

# step 3: heavy computation routine
def background():
    print "start runing backgroun process"
    time.sleep(3) # simulate heavy computation routine
    data = 'done from background'
    done(data)

# step 2: initiate background process
def init():
    t = Thread(target=background)
    t.daemon = True
    t.start()

# step 1: home interface
@app.route('/')
def front_end():
    init()
    return 'initiate bachground process'

if __name__ == '__main__':
    app.run()

interface.py 运行时,在浏览器中访问 127.0.0.1:5000 会得到一个字符串initiate bachground process。但是,最终数据(在这种情况下为字符串done from background)仅在服务器的终端中处理,而不是在浏览器中处理。

我相信大多数服务器通常都会执行此过程,但我找不到任何烧瓶解决方案......还是我走错了方向?

【问题讨论】:

  • 当你到达/done 路由时会发生什么?
  • 你的意思是直接从浏览器访问127.0.0.1:5000/done?在此设置下,done 期望来自函数调用的输入参数。所以直接从地址 127.0.0.1:5000/done 访问它会导致内部服务器错误。
  • 您是否打算使用/done 路由进行投票?所以你会首先请求/,然后每隔一段时间调用/done,直到它返回一些东西?
  • 我想到的是首先请求/,当计算完成时,它会从服务器端调用/done。我不知道应该怎么做,我虽然可以纯粹从烧瓶方面来实现(不会弄乱javascript或任何东西)......但也许我必须接受@barjey的建议
  • 如果您不想投票,那么这就是要走的路。您还可以查看服务器发送的事件,这比 websockets 和 comet(长轮询)更简单。有一个烧瓶示例 sn-p here 可能提供一些指针。

标签: python flask


【解决方案1】:

如果您想知道该过程何时完成,我建议使用以下之一:

  • 长轮询
  • WebSocket

但是你可以重新加载整个页面:

window.location.reload()

最好只从服务器返回后台进程的结果并只更新页面的相关片段。

【讨论】:

  • 感谢指点! This 似乎是我需要的。但我认为这可以以更简单的方式完成......?
  • 不,除非你有一个打开的连接,否则你不能从服务器向浏览器发送数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-10
  • 2017-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-10
相关资源
最近更新 更多