11

Web ページにアクセスできるようにしたいのですが、Python 関数を実行し、進行状況を Web ページに表示します。

そのため、Web ページにアクセスすると、コマンド ラインからスクリプトを実行したかのようにスクリプトの出力が表示され、コマンド ラインで出力が表示されます。

関数で何をする必要がありますか?

テンプレートで何をする必要がありますか?

編集:

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)

実行されますが、ブラウザーに何も表示されません。

4

5 に答える 5

16

以下は、プロセスの出力を通常の 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)
于 2013-02-23T15:45:58.063 に答える
10

今日も同じ問題があり、Markus Unterwaditzer の回答をテンプレートで動作するように適応させる方法を見つけました。

重要なのは、フラスコの で使用されるのTemplate.generate()代わりにjinja を使用することです。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 %}
于 2013-05-03T13:16:43.327 に答える
3

これを行う最も簡単な方法は、ページを作成し、AJAX を使用してサーバーに定期的にリクエストを送信し、結果を使用してページのコンテンツを更新することだと思います。これには、これを行うためのロング ポーリングの実装が含まれる場合があります。

これを行う方法にかかわらず、何らかの方法で関数をノンブロッキングにする必要があります。これにより、関数が動作している間でもリクエストを処理できるようになります。待機中のリクエストがある場合はリクエストを処理し、そうでない場合は関数の次の「チャンク」を実行し続ける関数を手動で作成できます。これには、必要に応じてディスパッチできるように、関数を小さな部分に分解することが含まれます。

関数が IO と CPU のどちらの使用量に制限されているかによって、スレッド化またはマルチプロセッシングを使用する方がよい場合があります。

于 2013-02-23T15:12:14.973 に答える
1

WebSocket を使用する予定はありますか? もしそうなら、あなたは参照することができます: Flask と Gevent を備えた Websocket

于 2013-02-24T01:49:22.027 に答える
-1

テンプレートの 1 つでメタ リフレッシュを使用できます。

meta http-equiv="更新" content="5"

于 2013-02-23T15:05:58.133 に答える