aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fg21sim/webui/__init__.py4
-rw-r--r--fg21sim/webui/app.py37
-rw-r--r--fg21sim/webui/websocket.py27
-rw-r--r--requirements.txt1
-rwxr-xr-xsetup.py1
5 files changed, 70 insertions, 0 deletions
diff --git a/fg21sim/webui/__init__.py b/fg21sim/webui/__init__.py
new file mode 100644
index 0000000..637e653
--- /dev/null
+++ b/fg21sim/webui/__init__.py
@@ -0,0 +1,4 @@
+# Copyright (c) 2016 Weitian LI <liweitianux@live.com>
+# MIT license
+
+from .app import make_application
diff --git a/fg21sim/webui/app.py b/fg21sim/webui/app.py
new file mode 100644
index 0000000..63d80be
--- /dev/null
+++ b/fg21sim/webui/app.py
@@ -0,0 +1,37 @@
+# Copyright (c) 2016 Weitian LI <liweitianux@live.com>
+# MIT license
+
+"""
+Web user interface (UI) of "fg21sim" based upon Tornado_.
+
+.. _Tornado: http://www.tornadoweb.org/
+"""
+
+import os
+
+import tornado.web
+
+from .websocket import EchoWSHandler
+
+
+class IndexHandler(tornado.web.RequestHandler):
+ def get(self):
+ self.render("index.html")
+
+
+_settings = {
+ # The static files will be served from the default "/static/" URI
+ "static_path": os.path.join(os.path.dirname(__file__), "static"),
+ "template_path": os.path.join(os.path.dirname(__file__), "templates"),
+}
+
+
+def make_application(**kwargs):
+ settings = _settings
+ settings.update(kwargs)
+ appplication = tornado.web.Application(
+ handlers=[
+ (r"/", IndexHandler),
+ (r"/ws", EchoWSHandler),
+ ], **settings)
+ return appplication
diff --git a/fg21sim/webui/websocket.py b/fg21sim/webui/websocket.py
new file mode 100644
index 0000000..ab846df
--- /dev/null
+++ b/fg21sim/webui/websocket.py
@@ -0,0 +1,27 @@
+# Copyright (c) 2016 Weitian LI <liweitianux@live.com>
+# MIT license
+
+"""
+Communicate with the "fg21sim" simulation program through the Web UI using
+the WebSocket_ technique, which provides full-duplex communication channels
+over a single TCP connection.
+
+.. _WebSocket: https://en.wikipedia.org/wiki/WebSocket ,
+ http://caniuse.com/#feat=websockets
+"""
+
+import tornado.websocket
+
+
+class EchoWSHandler(tornado.websocket.WebSocketHandler):
+ def open(self):
+ print("WebSocket opened")
+
+ def on_message(self, message):
+ print("Message received: %s" % message)
+ msg_back = message[::-1]
+ print("Message sent back: %s" % msg_back)
+ self.write_message(msg_back)
+
+ def on_close(self):
+ print("WebSocket closed")
diff --git a/requirements.txt b/requirements.txt
index 60199f0..8d240fc 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -7,3 +7,4 @@ healpy
configobj
beautifulsoup4
requests
+tornado
diff --git a/setup.py b/setup.py
index 2dcece2..ffa3627 100755
--- a/setup.py
+++ b/setup.py
@@ -93,6 +93,7 @@ setup(
"configobj",
"beautifulsoup4",
"requests",
+ "tornado",
],
tests_require=["pytest"],
cmdclass={"test": PyTest},