2017-03-13 7 views
0

私は大量の入力を含むFlaskアプリケーションを開発しています。入力の中には他の入力に依存するものがあるので、これらの依存入力を公開するDOM操作があります。ユーザーがすべてを再入力する必要がないように、ユーザーが戻ったときにアプリケーションがDOM状態を覚えておきたいです。これを行う最善の方法は何ですか?フラスコ:アプリケーション全体の変数+ DOM操作を記憶する

以下は、私がうまくいくと思われることを示しています。私は番号を取る入力ボックスを持っています。同じ入力フィールドをDOMに追加するボタンもあります。ユーザーがサブミットをクリックすると、これらの入力はinput_listに追加され、リストがUIに表示されます。 input_listはグローバル変数なので、アプリケーションはこれらの入力とその値を覚えています(たとえブラウザに戻るかページをリロードしたとしても)。これが私が探しているものです。

もう一度、これを実行する最良の方法であるかどうかはわかりません。私はflask.gアプリケーションのグローバルを格納するために使用することができますが、私はこれ(データベース接続を格納するために使用されて見たことがある)のための適切なユースケースであるかどうかはわかりません。また、CookieがDOMの変更を記憶するのに役立つと聞いています。どのような思考/例が役に立つでしょう。誰かが自分のやり方が大丈夫だと思うなら、私は以下のコードに感謝します。

app.py:

@app.route('/input_page', methods=['GET', 'POST']) 
def input_page(): 
    global input_list 
    input_list = [] 
    if request.method == 'POST': 
     if request.form.get('empty_list'): 
      input_list = [] 
     elif request.form.get('submit_list'): 
      input_list = [int(i) for i in request.form.getlist('x')] 
    return render_template('input_page.html', input_list=input_list) 

input_page.html:あなたは正しい軌道に乗っているようだ

<p>{{ input_list }}</p> 

<form method="POST" action="/input_page"> 
    <div id="input_container"> 
    {% if input_list %} 
     {% for i in input_list %} 
     <input type="number" name="x" value="{{ input_list[loop.index0] }}"> 
     {% endfor %} 
    {% else %} 
     <input type="number" name="x"> 
    {% endif %} 
    </div> 
    <button type="button" id="add_input">Add Input</button> 
    <input type="submit" value="Submit List" name="submit_list"> 
    <input type="submit" value="Empty List" name="empty_list"> 
</form> 

<script> 
    $(document).ready(function(){ 
    $('#add_input').click(function(){ 
     var $new_input = $('<input>', {type: 'number', name: 'x'}); 
     $('#input_container').append($new_input); 
    }); 
    }) 
</script> 
+0

あなた 'request.form'のみ提出フィールドに関する情報が含まれています。だから、 'request.form'からアイテムを取り出して、レンダリングされたHTMLの中に貼り付けるのはどうですか? – wanderlust

+0

あなたはそれが何を意味するのか混乱していますか? –

+0

'request.form'は{DOM_name ':' DOM_value '}のペアを含むImmutableDictです。だからあなたのフォームに属性 'name' ==' 'のタグがあり、それに何らかの値があれば、' request.form.get( 'name') 'を参照してサーバ側でこの値を取得することができます。後でこの値を新しく生成したフォームに入れることができます。 – wanderlust

答えて

2

。しかし、グローバル変数から他の並行クライアントに本質的にエクスポーズするので、私はそれを避けています。次に、あなたのPythonコードでは、あなたが使用したい

from flask import Flask, session, ... # other flask modules you already have imported 

:私は、しかし、フラスコsessionオブジェクトを使用することをお勧めします

def input_page(): 
    if request.method == 'POST': 
     if request.form.get('empty_list'): 
      session['input_list'] = [] 
     elif request.form.get('submit_list'): 
      session['input_list'] = [int(i) for i in request.form.getlist('x')] 
    input_list = session.get('input_list', False) # create an input_list var that either grabs the 'input_list' object from the session object or defaults to False if no key found 
    return render_template('input_page.html', input_list=input_list) 
+0

私が感謝のために探しているもの。セッションを使用するにはログイン/ログアウトシステムが必要ですか(それはこれまで私がこれまで使ってきたものです)?あるいは、フラスコは見える新しいブラウザごとに新しいセッションオブジェクトを作成するだけです(何らかの方法で秘密鍵を使用するように見えます) –

+1

ユーザの認証は不要です。セッションはクライアントによってバインドされます。 :) –

+0

私のジンジャーテンプレートで 'session ['input_list']'にどのくらい正確にアクセスしますか?それは '{{session.input_list}}'ですか? –

関連する問題