【问题标题】:Emitting messages from python-shell to a browser in a Node Express App在 Node Express 应用程序中从 python-shell 向浏览器发送消息
【发布时间】:2016-04-17 09:44:21
【问题描述】:

我有一个 express 应用程序,我希望能够通过路由触发 python 脚本并将日志发送到浏览器中。

我创建了一个路由,可以正确触发 python 脚本并使用 python-shell 模块将日志输出到节点控制台。如何将此日志实时推送到浏览器。

我在 index.html 页面上有一个按钮,它触发了对下面 /python 路由的 Ajax 发布请求。我曾尝试使用 socket.io 来实现这一点,但没有设法解决这个问题。 socket.io 是前进的方向吗,请指出正确的方向,或者有人可以推荐替代方案吗?

我的文件布局是:

server.js

var express      = require('express');
var path         = require('path');
var app          = express();
var port         = process.env.PORT || 3000;
var http         = require('http');
var server       = http.createServer(app);
var io           = require('socket.io').listen(server);

/* A bit inbetween */

server.listen(port)

app/routes.js

var PythonShell = require('python-shell');
var config      = require('../config/config');

module.exports = function(app) {
      app.get('/', function(req, res) {
        res.render('pages/index.ejs', {
            pageTitle: 'Index'
        }); // load the index.ejs file
      });

      app.post('/test', function(req, res) {

          var options = {
               mode: 'text',
               pythonPath: config.pythonPath,
               pythonOptions: ['-u'],
               scriptPath: config.pythonScriptsDirectory
             };

             var pyshell = new PythonShell('printRange.py', options);

             pyshell.on('message', function (message) {
               console.log(message);
             });

         res.sendStatus(200)
      });

}

提前致谢

【问题讨论】:

  • socket.io 是一个很好的解决方案。这将负责将消息从服​​务器传递到客户端。您只需将消息发布到服务器端,并让回调在客户端对其做出反应。
  • 您能否提出一种有效的方法来在我的节点应用程序中构建它?

标签: python node.js express socket.io


【解决方案1】:

socket.io 是一个很好的解决方案。这将负责将消息从服​​务器传递到客户端。您只需将消息发布到服务器端,并让回调在客户端对其作出反应

在服务器端,您将拥有如下内容:

var app = require('express')();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
io.on('connection', function(){ 
  console.log('connected');
});
server.listen(3000);

...

var pyshell = new PythonShell('printRange.py', options);
pyshell.on('message', function (message) {
  if (connected)
     io.emit('logentry',message);
});

在客户端,你会得到这样的东西:

<script src='/socket.io/socket.io.js'></script>

<script>
  var socket = io();
  socket.on('logentry',function(log_entry){
    add_to_html(log_entry); // You need to implement this function.
  });
</script>

【讨论】:

    猜你喜欢
    • 2015-04-07
    • 2015-09-15
    • 2013-04-02
    • 2016-02-21
    • 2017-08-26
    • 2019-12-16
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    相关资源
    最近更新 更多