我希望能够访问网页,它将运行python函数并在网页中显示进度。
因此,当您访问该网页时,您可以看到脚本的输出,就像您从命令行运行它并在命令行中查看输出一样。
我需要在函数中做什么?
我需要在模板中做些什么?
编辑:
我正在尝试使用Markus Unterwaditzer的代码模板。
{% extends "base.html" %}
{% block content %}
{% autoescape false %}
{{word}}
{% endautoescape %}
{% endblock %}
Python代码
import flask
from flask import render_template
import subprocess
import time
app = flask.Flask(__name__)
@app.route('/yield')
def index():
def inner():
for x in range(1000):
yield '%s<br/>\n' % x
time.sleep(1)
return render_template('simple.html', word=inner())
#return flask.Response(inner(), mimetype='text/html') # text/html is required for most browsers to show the partial page immediately
app.run(debug=True, port=8080)
它运行但我在浏览器中看不到任何内容。
答案 0 :(得分:14)
这是一个非常简单的应用程序,它使用普通HTTP流式传输进程的输出:
import flask
import time
app = flask.Flask(__name__)
@app.route('/yield')
def index():
def inner():
for x in range(100):
time.sleep(1)
yield '%s<br/>\n' % x
return flask.Response(inner(), mimetype='text/html') # text/html is required for most browsers to show the partial page immediately
app.run(debug=True)
答案 1 :(得分:6)
我今天遇到了同样的问题,并找到了一种方法来改变Markus Unterwaditzer对模板工作的回答。
关键是使用jinja的Template.generate()
代替Template.render()
,而render_template()
使用的是import flask
import time
from jinja2 import Environment
from jinja2.loaders import FileSystemLoader
app = flask.Flask(__name__)
@app.route('/yield')
def index():
def inner():
for x in range(100):
time.sleep(1)
yield '%s<br/>\n' % x
env = Environment(loader=FileSystemLoader('templates'))
tmpl = env.get_template('result.html')
return flask.Response(tmpl.generate(result=inner()))
app.run(debug=True)
。
result.html
假设有一个模板{% extends "layout.html" %}
{% block body %}
<body>
{% for line in result %}
{{ line }}
{% endfor %}
</body>
{% endblock %}
,如下所示:
{{1}}
答案 2 :(得分:3)
我认为最直接的方法是创建页面,然后使用AJAX定期向服务器发出请求,并使用结果更新页面上的内容。这可能包括实施long polling来执行此操作。
无论如何,您都需要以某种方式使您的功能无阻塞,这样您仍然可以在操作时提供请求。如果有一个请求,您可以手动编写一个服务请求的函数,否则继续运行该函数的下一个“块”。这将涉及将您的功能分解为小部分,以便您可以根据需要调度它们。
更好的方法可能是使用线程或多处理,具体取决于您的函数是否受IO或CPU使用限制。
答案 3 :(得分:1)
你有计划使用WebSocket吗?如果是这样,您可以参考:Websocket with Flask and Gevent
答案 4 :(得分:-1)
您可以在其中一个模板中使用元刷新
meta http-equiv =“refresh”content =“5”