在 Odoo 中使用 WebSocket 并兼容Odoo的Session会话识别

  1. from geventwebsocket import WebSocketApplication
  2. from ..http import OpenERPSession
  3. import odoo
  4. from odoo.tools.func import lazy_property
  5. class WsApplication(WebSocketApplication):
  6. def get_cookie(self, key):
  7. raw = self.ws.environ['HTTP_COOKIE']
  8. if raw:
  9. _dict = dict([ e.strip().split('=',1) for e in raw.split(';')])
  10. return _dict.get(key,None)
  11. else:
  12. return None
  13. @lazy_property
  14. def session_store(self):
  15. # Setup http sessions
  16. path = odoo.tools.config.session_dir
  17. _logger.debug('HTTP sessions stored in: %s', path)
  18. return werkzeug.contrib.sessions.FilesystemSessionStore(path, session_class=OpenERPSession)
  19. def setup_session(self):
  20. sid =self.get_cookie('session_id')
  21. if sid is None:
  22. session = None
  23. else:
  24. session = self.session_store.get(sid)
  25. self.session = session
  26. return session
  27. def get_current_user(self):
  28. pass
  29. def on_open(self):
  30. session = self.setup_session()
  31. def on_message(self, message):
  32. pass
  33. def on_close(self, reason):
  34. pass
  35. class WsServer(WebSocketServer):
  36. debug_log_format = (
  37. '%(levelname)s in %(module)s: ' +
  38. '%(message)s'
  39. )
  40. def run():
  41. WsServer(
  42. (config.main_server_conf['host'], config.main_server_conf['port']),
  43. Resource([
  44. #('/', application), # UI app
  45. ('/ws', WsApplication)# WebSocket app
  46. ]),
  47. debug=True
  48. ).serve_forever()

融合odoo的服务运行

  1. #!/usr/bin/env python
  2. __import__('pkg_resources').declare_namespace('odoo.addons')
  3. import odoo
  4. from odoo.service import server
  5. class WebSocketServer(object):
  6. pass
  7. # WebSocketServer(odoo.service.wsgi_server.application)
  8. service.GeventServer = WebSocketServer
  9. if __name__ == "__main__":
  10. odoo.cli.main()

Related