【问题标题】:Print to HTML without "return"无需“返回”即可打印到 HTML
【发布时间】:2016-01-08 08:34:39
【问题描述】:

假设我想做一个简单的循环,我需要一些时间来执行它。

for i in range(0, 100000000000):
    print i

现在,这是我拥有的 Bottle 的代码。我想在循环结束之前打印出所有的中间输出,比如 1,2,3,4...。

import bottle

@bottle.route('/')
def home_page():
    total = 0
    for i in range(0, 100000000000):
        total = i + 0
        print i
    return bottle.template('hello.tpl', {"total": total})

如何在迭代期间输出 i?我尝试了“响应”,但没有成功,无论如何它仍然必须返回。

【问题讨论】:

  • 我认为您误解了网页如何工作的基本原理。您可能会通过使用 ajax 请求轮询后端来获得一些工作,但在大多数情况下,这并不是经常做的事情。另外,据我所知,“烧瓶”与您的问题无关
  • 但仅此而已,网页通过发送请求并等待单个响应来工作。因此,您可以将进度存储在某处并继续发送有关该进度的请求,但这对于 stackoverflow 的答案来说太宽泛了。
  • 实际上可以通过http将部分内容推送到浏览器。 PHP 实现了一个称为刷新的功能,如果我没记错的话,它会在给定的大小/时间阈值之后自动刷新内容,这可能会导致初学者认为部分响应是规则而不是例外。以这个问题为例:stackoverflow.com/questions/6300859/…

标签: python bottle


【解决方案1】:

我想你是在问一个很长的民意调查。 The Bottle docs mention this 在使用 Greenlets 的情况下。这是那里的示例:

from gevent import monkey; monkey.patch_all()

from time import sleep
from bottle import route, run

@route('/stream')
def stream():
    yield 'START'
    sleep(3)
    yield 'MIDDLE'
    sleep(5)
    yield 'END'

run(host='0.0.0.0', port=8080, server='gevent')

也有一些other SO questions讨论这个。

祝你好运!

【讨论】:

  • 这正是我想要的。谢谢老兄。
【解决方案2】:

您不能在迭代期间将 i 输出到 html。您可以做的是将项目列表返回到您的模板并按照@Baterson 的建议在返回 HTTP 响应之前呈现它们。

如果您需要调试您的应用程序,请考虑使用python debugger。 此外,在您的项目中设置 python logging 可以简化对您项目的错误跟踪。

print 上面的代码 sn-p 将在您的控制台中显示数据(您在其中运行了 Web 服务器,因此如果您需要检查 i 的值是什么,请切换到控制台并查看那里发生了什么)。

给你的小建议是熟悉MVC Design Paradigm,在阅读理解那篇文章之后,你会更容易使用botle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 2013-03-15
    • 2016-10-06
    • 1970-01-01
    相关资源
    最近更新 更多