我在 Tornado Framework 中使用 WebSockets,无法将 html 格式的数据发送到 Tornado 类。
这是我的代码:
class MainHandler(tornado.web.RequestHandler):
event = []
def get(self):
self.render('main.html')
def post(self):
MainHandler.event = self.get_argument('event')
当我尝试将事件发送到 WebSocketHandler 类时。没有从表单中收到数据:
class WSHandler(tornado.websocket.WebSocketHandler):
def open(self):
print "tailing..."
db = Connection().blah
coll = db.blah_tail
event = MainHandler.event
print 'Filtered', event
'Filtered' 只打印一个空列表:“Filtered []”。
html 形式:
<form action="/" method="post">
<input type="text" name="event" />
<input type="submit" id="open" value="Submit Query" />
</form>
如何将表单数据发送到 WSHandler 类?
谢谢
创建websocket的js:
<script>
$(document).ready(function() {
var ws;
$("#open").click(function(evt){
evt.preventDefault();
ws = new WebSocket("ws://" + "localhost" + ":" + "8888" + "/ws");
ws.onmessage = function(evt) $("#display").append(evt.data + "<br />");
ws.onclose = function(evt) {alert("Server connection terminated");};
});
});
</script>
最佳答案
就像 Tornado 文档中的示例一样,我将为 WebSocket 客户端使用 set
。对此进行改进留给读者作为练习。
# clients listing on the WebSocket
clients = set()
class MainHandler(tornado.web.RequestHandler):
def get(self):
return self.render("index.html")
def post(self):
global clients
event = self.get_argument("event")
print "got event", event
if not clients:
print "No WebSockets, no point in querying the database"
return
for coordinate in self.get_coordinates(event):
for client in clients:
print "sending coordinate", coordinate, "to client", client
client.write_message(json.dumps(coordinate,
default=json_util.default))
def get_coordinates(self, event):
# replace with a real database query
for coordinate in ("No", "man's", "land"):
time.sleep(1)
yield coordinate
class WSHandler(tornado.websocket.WebSocketHandler):
def open(self):
global clients
print "WebSocket opened..."
clients.add(self)
def on_close(self):
global clients
print "WebSocket closed..."
clients.remove(self)
index.html
模板的相关部分:
<script type="text/javascript">
$(document).ready(function() {
var ws;
// open WebSocket for getting the results
ws = new WebSocket("ws://" + location.host + "/ws");
ws.onmessage = function(evt) {
$("#display").append(evt.data + "<br>");
};
ws.onclose = function(evt) {alert("Server connection terminated");};
$("#open").click(function(evt) {
evt.preventDefault();
$.post("/", $("#eventForm").serialize());
});
});
</script>
</head>
<body>
<h1>Event follower</h1>
<h2>Enter the event you would like to follow</h2>
<form id="eventForm" action="/" method="post">
<input type="text" name="event" />
<input type="submit" id="open" value="Submit Query" />
</form>
<h2>Coordinates</h2>
<div id="display">
</div>
</body>
加载页面时,将与服务器建立 WebSocket 连接到 WSHandler
类,并将客户端添加到 clients
集。当页面关闭时,WebSocket 连接关闭,服务器会将其从集合中移除。
当点击打开 提交按钮时,表单将使用 AJAX 异步提交到 MainHandler.post
。该方法将找出与该事件相关的坐标,并在它们到来时将它们发送给监听客户端。浏览器接收每个坐标并将其附加到 display div
。
关于python - Tornado 类未收到 HTML 表单数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13324270/