2017-12-02 12 views
-1

フラスコを初めて使用しています。私はブラウザに出力をストリームするコードを持っています。私の下のコードでは、私はブラウザから範囲の値を入力し、範囲までカウントを表示する必要があります。前もって感謝します。フラスコを使用してブラウザに出力をストリームする方法

import flask 
import time 

from jinja2 import Environment 
from jinja2.loaders import FileSystemLoader 

app = flask.Flask(__name__) 

@app.route('/') 
def index(): 
    def inner(): 
     for x in range(100):# eg: 100 should input value from browser 
      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 
<html> 
{% block body %} 
<body> 
    {% for line in result %} 
    {{ line }} 
    {% endfor %} 
</body> 
{% endblock %} 
</html> 
+0

より多くを学ぶためにFlask Quickstart Tutorialをたどることができますか? –

+0

ありがとうAmit、はい、それは要件です。ユーザーが値を入力し、同じページまたは別のページに出力を表示します。いずれにしても簡単です。 – Prashanth

+0

Flask Jinja2をajaxなしで使用する予定の場合は、ページをリロードするか、新しいページを開く必要があります。コンテンツを動的に読み込むajaxを使用する場合は、ページの再読み込みを行わなくても可能です。 –

答えて

0

ここでは、あなたがしようとしていることに対する回答です。私はあなたのアプリケーションのコードを変更した

import flask 
import time 

from flask import request 
from jinja2 import Environment 
from jinja2.loaders import FileSystemLoader 

app = flask.Flask(__name__) 

@app.route('/', methods=['GET', 'POST']) 
def index(): 
    result = None 
    if request.method == 'POST': 
     counter = int(request.form.get('counter', 0)) 
     def inner(): 
      for x in range(counter):# eg: 100 should input value from browser 
       time.sleep(1) 
       yield '%s<br/>\n' % x 
     result = inner 
    env = Environment(loader=FileSystemLoader('templates')) 
    tmpl = env.get_template('result.html') 
    return flask.Response(tmpl.generate(result=result if result is None else result())) 

app.run(debug=True) 

ここで私は両方GETPOSTメソッドを処理するために、インデックスビューを変更しました。単純なGETリクエストが来たら、result=Noneのテンプレートを返し、メソッドがPOSTの場合はreturns=result()(私はPOSTブロックにresult = innerを割り当てました)。 Noneまたは値を処理するロジックはテンプレートで処理されます。あなたが同じテンプレートを使用しているとも、URLが変更されないように私はのif-else条件を追加した

<html> 
{% block body %} 
<body> 
{% if result%} 
    {% for line in result %} 
    {{ line }} 
    {% endfor %} 
{% else %} 
    <form method="post"> 
     <input type="text" placeholder="Enter a number" name="counter"> 
     <input type="submit" value="Submit"> 
    </form> 
{% endif %} 
</body> 
{% endblock %} 
</html> 

そして、あなたのテンプレートに変更する必要があります。

あなたは、ユーザーがブラウザから、あなたは、カウントを表示するページのロードせずに値を入力するように動的にそれをやりたい

関連する問題