NodeJS 如何在Python中通过Express服务器处理请求

mitkmikd  于 2023-03-01  发布在  Node.js
关注(0)|答案(1)|浏览(177)

我的方法是用Python编写一个Flask服务器并将请求转发给它。
Demo.py

from flask import Flask

app= Flask(__name__)

@app.route("/")
def index():
    return "Hello World"

if __name__ == '__main__':
    app.run(debug=True)

另外,我还尝试直接调用python脚本,然后从stdout收集结果。
Trial.js

const express = require('express')
const app = express()

app.get('/', (req, res) => {

    const { spawn } = require('child_process');
    const pyProg = spawn('python', ['C:/Users/Selectigence/PycharmProjects/jobapplicationbot/Sample3.py']);

    pyProg.stdout.on('data', function(data) {

        console.log(data.toString());
        res.write(data);
        res.end('end');
    });
})

app.listen(4000, () => console.log('Application listening on port 4000!'))
htrmnn0y

htrmnn0y1#

我最近遇到了类似的问题,我运行的是Node JS服务器,但是客户端请求必须用Python处理,所以我选择了一个架构,它是这样的:

  • Web进程 * 是Node JS服务器,* 后台服务 * 是用Python编写的。

为了实现这个体系结构,我必须回答以下问题:
1.如何实现 * 后台服务 *。
1.如何使 * 后台服务 * 与 *Web进程 * 通信。
我使用celery来实现我的 * 后台服务 *。
tasks.py

import os
from celery import Celery

REDIS_URL='redis://127.0.0.1:6379'
app = Celery('tasks', backend=REDIS_URL, broker='REDIS_URL')

@app.task
def doSomething(arguments):
    # Do whatever you want with the arguments 
    # and return the result ...
    return result

我的 *Web进程 * 定义如下:
app.js

const celery = require("node-celery");
const express = require("express");
const app = express();

const REDIS_URL = "redis://127.0.0.1:6379";

app.get("/", (req, res, next) => {
  const client = celery.createClient({
    CELERY_BROKER_URL: REDIS_URL,
    CELERY_RESULT_BACKEND: REDIS_URL
  });

  client.on("error", function(err) {
    console.log(err);
  });

  client.on("connect", function() {
    const { arguments } = req.body;
    // Here send task to Python process and 
    // process the result.
    client.call("tasks.doSomething", [arguments], result => {
      // The result object contains the result 
      // of the doSomething function in the "result"
      // field along with other information regarding 
      // whether the call was successful.
      res.send({ result: result.result });
      client.end();
    });
  });
});

app.listen(4000, () => console.log('Application listening on port 4000!'))

现在我需要在这两个进程之间建立一个通信通道,我使用redis作为消息代理。
在命令行中,我运行:

$ redis-server &
$ npm start &
$ celery -A tasks worker --loglevel=INFO &

现在,每当我通过浏览器向服务器发送GET请求时,服务器会将请求中的参数转发给Python服务,该服务处理参数,并将结果返回给服务器,服务器最后用返回给浏览器的响应来完成请求。

相关问题