python - Tornado 类未收到 HTML 表单数据

标签 python html websocket tornado

我在 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/

相关文章:

python - 访问字典键元组的各个元素

python - tf.where 的 TensorFlow 梯度在不应该返回 NaN 时返回 NaN

java - 如何从 Java EE 应用程序外部化 PDF?

c# - 创建 "Hello World"WebSocket 示例

python 3.5 - asyncio - 运行并发连接池

python - QGridLayout 中 QPushButton 之间的距离

python - 如何在 Airflow 的 S3KeySensor 中动态添加 bucket_key 值

javascript - Bootstrap 整个图像作为按钮

html - 过渡悬停div css

javascript - WebSocket 总是发送字符串化的 JSON 对象作为缓冲区