2012-12-23 502 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的同一個人?

我通常堅持對全局列表/字典中每個websocket連接的引用。某種參考可以讓我將服務器端輸出寫入正確的連接。

+0

感謝您的提醒。我現在改變了我的代碼,所以客戶機 - 服務器之間的唯一通信就是通過websockets。這也意味着我可以消除代碼中的所有全局變量。 – user1869421

+1

聽起來不錯,詳細一點。如果你看看龍捲風聊天演示代碼,他們會使用一個全局的「服務員」列表,這些列表都存在於其中一個類中。雖然https://github.com/facebook/tornado/blob/master/demos/chat/chatdemo.py取決於您的應用程序可能過度殺傷 – aychedee