2012-12-23 2 views
2

지금까지 나는 하나의 Tornado 클래스의 변수를 global으로 선언하여 다른 변수로 전달했습니다. 나는 이것이 그렇게하는 이상적인 방법이 아닐 수도 있다고 생각한다. 다음은 내 코드 샘플입니다.Tornado 클래스에서 전역 변수 전달하기

class MHandler(tornado.web.RequestHandler): 
@tornado.web.asynchronous 

def get(self): 
    self.render('index.html') 

def post(self): 
    global account_age 

    age = self.get_argument('age') 

    account_age = [age] 


class AgeHandler(tornado.websocket.WebSocketHandler):  
@tornado.web.asynchronous 
@gen.engine 

def open(self): 
    global account_age 


    print 'Your account is overdue by: ', account_age 

이 프레임 워크에서 변수를 공유하는 데 더 적합한 방법이 무엇인지 알고 싶습니다.

난 단지 몇 주 동안 파이썬과 토네이도를 해왔으므로, 내 무지를 용서해주십시오.

감사합니다.

답변

2

그래, 그렇게하지 않을 것입니다. 이 간단한 예제에서도 POST와 websocket 열기 사이에 경쟁 조건이 있음이 분명합니다. POST를하는 사람이 websocket을 여는 사람과 동일한 사람인 것을 어떻게 보장 할 수 있습니까?

나는 일반적으로 전역 목록/dict에서 각 websocket 연결에 대한 참조를 가지고 있습니다. 내가 서버 측 출력을 올바른 연결에 쓸 수있게 해주는 일종의 참조.

+0

헤드 업에 감사드립니다. 지금 코드를 변경했기 때문에 클라이언트 - 서버 간의 유일한 통신은 웹 소켓을 통한 것입니다. 그것은 또한 코드에서 모든 전역 변수를 제거 할 수 있다는 것을 의미합니다. – user1869421

+1

조금 더 정교하게 들리는데 좋을 것 같습니다. 토네이도 채팅 데모 코드를 보면 클래스 중 하나에 살고있는 "웨이터"의 전체 목록을 사용합니다. 어쩌면 당신의 어플리케이션에 따라 과잉 될 수도 있습니다. https://github.com/facebook/tornado/blob/master/demos/chat/chatdemo.py – aychedee