2017-11-28 6 views
0

私は投票システムを実装しようとしています。それはこのように動作します。ユーザーが投稿に投票すると、セッション変数に一時変数が記録されます:upvoted、starredなど。Flaskはスレッドからセッション変数を削除します

結果が一時テーブルに保存される前に、現在のユーザーが投票していない場合。ユーザーは5分で投票を変更することができます。 5分経過後、結果はスレッドを使用して永久にデータベースに書き込まれます。

私は結果がデータベースに書き込まれた後に一時的なセッション変数をクリアしたいと思います。これを達成する方法はありますか?

task.py

import threading 
import time 
from flask import Flask, copy_current_request_context, session 
from threading import Lock 
from vote import voteQuestion 

app = Flask(__name__) 
app.secret_key="appkey" 

@app.before_first_request 
def initializeTask(): 
    @copy_current_request_context 
    def runTask(): 
     while True: 
      voteQuestion() 
      time.sleep(10) 

    task = threading.Thread(target=runTask) 
    task.start() 

@app.route('/vote') 
def vote(): 
    session['test'] = "This is a test" 
    return 'success' 


@app.route("/") 
def hello(): 
    return "Hello world!" 


if __name__ == "__main__": 
    app.run() 

vote.py

from flask import session 

def voteQuestion(): 
    print('session variables', session.items()) 
    result = session.get('test', 'not set') 

    print ('result ', result) 


    if 'test' in session: 
     session.pop('test', None) 
    print ('Running in the background') 

答えて

1

いいえ、それは不可能です。要求は終了し、そのスレッドのセッションは基本的に読み取り専用のコピーです。更新されたクッキーをブラウザに運ぶための応答がないので、それに書き込むことは何もしません。

スレッドとセッションで何かをしようとするのではなく、一時的な投票を保存するときに一時的なテーブルにタイムスタンプを格納する方が意味があります。

+0

私はすでにタイムスタンプを一時テーブルに保存しています。しかし、id 3のこのユーザーが投稿5に投票したとしよう。投票ボタンの色はオレンジなどになります。彼はポスト7に投票し、ポスト5に戻ります。現在の状況で私は一時的な投票状態を保存するためにセッション変数を使用します:upvotedなど – Erdem

+0

なぜセッションが必要ですか?すでにテーブルに入っています。 – davidism

+0

一時テーブルに前の票があるためです。一見すると、最後の投票のみを投票テーブルにコピーし、セッション変数を使用して一時投票状態を保存することをお勧めします。現在の状況で私のテンプレートファイルはそうです - セッションが設定されている場合、このデータを使用してください。私が仮投票テーブルのデータを使用している場合、5分の最後に、仮投票からデータを取るか、テンプレートの投票テーブルからデータを取るかを決定する必要があります。 – Erdem

関連する問題