在 Odoo 中使用 WebSocket 并兼容Odoo的Session会话识别
from geventwebsocket import WebSocketApplication
from ..http import OpenERPSession
import odoo
from odoo.tools.func import lazy_property
class WsApplication(WebSocketApplication):
def get_cookie(self, key):
raw = self.ws.environ['HTTP_COOKIE']
if raw:
_dict = dict([ e.strip().split('=',1) for e in raw.split(';')])
return _dict.get(key,None)
else:
return None
@lazy_property
def session_store(self):
# Setup http sessions
path = odoo.tools.config.session_dir
_logger.debug('HTTP sessions stored in: %s', path)
return werkzeug.contrib.sessions.FilesystemSessionStore(path, session_class=OpenERPSession)
def setup_session(self):
sid =self.get_cookie('session_id')
if sid is None:
session = None
else:
session = self.session_store.get(sid)
self.session = session
return session
def get_current_user(self):
pass
def on_open(self):
session = self.setup_session()
def on_message(self, message):
pass
def on_close(self, reason):
pass
class WsServer(WebSocketServer):
debug_log_format = (
'%(levelname)s in %(module)s: ' +
'%(message)s'
)
def run():
WsServer(
(config.main_server_conf['host'], config.main_server_conf['port']),
Resource([
#('/', application), # UI app
('/ws', WsApplication)# WebSocket app
]),
debug=True
).serve_forever()
融合odoo的服务运行
#!/usr/bin/env python
__import__('pkg_resources').declare_namespace('odoo.addons')
import odoo
from odoo.service import server
class WebSocketServer(object):
pass
# WebSocketServer(odoo.service.wsgi_server.application)
service.GeventServer = WebSocketServer
if __name__ == "__main__":
odoo.cli.main()