为什么request.body是空的?

时间:2016-02-27 00:37:38

标签: python websocket tornado

我尝试从用户那里获取数据:

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获取用户输入?

1 个答案:

答案 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表单提交时,通常更容易使用。