WebSocketHandler和RequestHandler之间的共享状态

时间:2015-04-27 14:21:25

标签: websocket tornado

我正在编写聊天应用程序,我需要在我的websocket处理程序中使用会话数据。问题是登录和注销是由AJAX请求完成的,而websocket处理程序无法看到更新/清除cookie - 它只能看到网站最初呈现时的状态。但是,当AJAX请求更改cookie时,它无法看到。你有什么想法,这是如何实现的?

import json

import tornado.web
import tornado.websocket

class BaseHandler(object):
    @property
    def db(self):
        return self.application.db

    def get_current_user(self):
        id = self.get_secure_cookie('user')
        user = self.db.get_user_by_id(id) if id else ''
        return user

class JsonHandler(BaseHandler, tornado.web.RequestHandler):
    def write(self, response):
        if response:
            response = json.dumps(response)
        TemplateHandler.write(self, response)

    @property
    def body(self):
        return json.loads(self.request.body.decode())

class WebSocketHandler(BaseHandler, tornado.websocket.WebSocketHandler):
    pass

class Login(JsonHandler):
    def post(self):
        login = self.body.get('login')
        password = self.body.get('password')
        user = self.db.validate_user(login, password)
        if user:
            self.set_secure_cookie('user', str(user['id']))
            self.write(user)
        else:
            raise tornado.web.HTTPError(401)

class Logout(JsonHandler):
    def post(self):
        self.clear_cookie('user')
        self.write('')


class WebSocket(WebSocketHandler):
    clients = set()

    def open(self):
        WebSocket.clients.add(self)

    def on_close(self):
        WebSocket.clients.remove(self)

    def on_message(self, message):
        # how to use method self.get_current_user()
        # it uses self.get_secure_cookie('user')
        # but it is not updated dynamically by Login and Logout handlers
        # because websocket does not share state with them

        for client in WebSocket.clients:
            client.write_message(message)

0 个答案:

没有答案