2017-11-28 2 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