我尝试从用户那里获取数据:
class EchoWebSocket(tornado.websocket.WebSocketHandler):
def open(self):
print("WebSocket opened")
def on_message(self, message):
nom = self.get_argument("nom") # this will return an error, because nom is not found
# I then tried to retrieve the result of the body,
print(self.request.body) # nothing to show!
def on_close(self):
print("WebSocket closed")
客户方:
$(document).ready(function() {
$("#frm").on("submit", function(e){
var formdata = $("#frm").serialize()
console.log(formdata) // gives _xsrf=2%7C0fc414f0%7Cf5e0bd645c867be5879aa239b5ce0dfe%7C1456505450&nom=sdfsdf
var ws = new WebSocket("ws://localhost:8000/websocket");
ws.onopen = function() {
ws.send(formdata);
};
ws.onmessage = function (evt) {
alert(evt.data);
};
e.preventDefault();
})
})
</script>
<form action="/websocket" method="post" id="frm">
{% raw xsrf_form_html() %}
<input type="text" name="nom" autofocus>
<button class="ui primary button">Envoyer</button>
</form>
我尝试了一种简单的ajax方式,并得到了:
class AjaxHandler(tornado.web.RequestHandler):
def post(self):
print self.request.body
#gives: _xsrf=2%7C0d466237%7Cf762cba35e040d228518d4feb74c7b39%7C1456505450&nom=hello+there
我的问题:如何使用websocket获取用户输入?
答案 0 :(得分:1)
websocket消息不是新的HTTP请求。 self.request(以及self.get_argument()等相关方法)指的是打开websocket的HTTP请求,并且在新消息到达时不会更改。相反,您使用websocket消息获得的唯一内容是on_message()的message
参数。这包含javascript发送的数据,您必须自己解析它。
def on_message(self, message):
args = {}
tornado.httputil.parse_body_arguments("application/x-www-form-urlencoded", message, args, {})
print(args["nom"][0])
您可能希望使用JSON而不是表单编码;当您不需要向后兼容纯HTML表单提交时,通常更容易使用。