В nodejs, как я могу записать вывод журнала Flask, запущенный PythonShell? - PullRequest
0 голосов
/ 07 августа 2020

Я реализовал конечную точку flask, которая записывает строку в журнал:

@app.route("/") 
@cross_origin()
def hi():
    print("hi")
    app.logger.info("hi2")
    return "hi"

Если я вызываю flask из командной строки, затем нажимаю эту конечную точку из браузера, flask регистрирует строку, как я и ожидал:

$ FLASK_ENV=development python py/server.py
 * Serving Flask app "server" (lazy loading)
 * Environment: development
 * Debug mode: on
 * Running on http://127.0.0.1:5001/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 223-046-607
hi
[2020-08-07 12:03:54,269] INFO in server: hi2
127.0.0.1 - - [07/Aug/2020 12:03:54] "GET / HTTP/1.1" 200 -

Вот моя наивная попытка захватить flask вывод от средства визуализации, вызвав метод on() экземпляра PythonShell:

function sendToPython_dev() {
    let { PythonShell } = require('python-shell');
    let options = {
        mode: 'text'
    };
    let pythonShell = PythonShell.run('./py/server.py', options, function (err, results) {
        if (err) throw err;
        console.log('response: ', results);
    });
    // Attempt to capture flask logging output
    pythonShell.on('message', function (message) {
        console.log('flask', message);
    });
}

Я вызываю его из командной строки вот так. К моему удивлению, я получаю первые три строки информации журнала, которые Flask генерирует при запуске, но не остальную часть инициализации, и я не вижу выходных данных журнала, когда я посещаю конечную точку в браузере:

$ FLASK_ENV=development ELECTRON_ENABLE_LOGGING=1 npm start

> my-app@1.0.0 start /home/projects/my-app
> electron-forge start

✔ Checking your system
✔ Locating Application
✔ Preparing native dependencies
✔ Launching Application

[14900:0807/120749.869098:VERBOSE1:CONSOLE(31)] "Main._createAppUI: 26.96875ms", source: devtools://devtools/bundled/main/main.js (31)
[14900:0807/120749.885893:VERBOSE1:CONSOLE(31)] "Main._showAppUI: 16.19482421875ms", source: devtools://devtools/bundled/main/main.js (31)
[14900:0807/120749.902785:INFO:CONSOLE(16)] "flask  * Serving Flask app "server" (lazy loading)", source: file:///home/projects/my-app/src/renderer.js (16)
[14900:0807/120749.905309:INFO:CONSOLE(16)] "flask  * Environment: development", source: file:///home/projects/my-app/src/renderer.js (16)
[14900:0807/120749.905424:INFO:CONSOLE(16)] "flask  * Debug mode: on", source: file:///home/projects/my-app/src/renderer.js (16)
[14900:0807/120749.920625:VERBOSE1:CONSOLE(31)] "Main._initializeTarget: 10.156005859375ms", source: devtools://devtools/bundled/main/main.js (31)
[14900:0807/120750.021953:VERBOSE1:CONSOLE(31)] "Main._lateInitialization: 0.653076171875ms", source: devtools://devtools/bundled/main/main.js (31)

Что я делаю не так?

1 Ответ

0 голосов
/ 07 августа 2020

Я заметил, что отображались операторы печати, но не сообщения журнала. Я полагаю, что эти первые несколько сообщений от инициализации Flask являются операторами печати, а не сообщениями журнала.

Итак, я решил проблему, перенаправив регистратор на стандартный вывод:

app = Flask(__name__) 
import sys, logging
handler = logging.StreamHandler(sys.stdout)
app.logger.addHandler(handler)

Теперь Flask сообщения журнала появляются в консоли Chromium Electron.

Я немного подчистил синтаксис рендерера.

function sendToPython_dev() {
    let { PythonShell } = require('python-shell');
    let options = {
        mode: 'text',
        pythonOptions: ['-u']
    };
    PythonShell.run('./py/server.py', options, function (err, results) {
        if (err) throw err;
        console.log('response: ', results);
    }).on('message', function (message) {
        console.log('flask', message);
    }).on('stderror', function (message) {
        console.log('flask error', message);
    });
}

Stackoverflow не позволяет мне принять мой собственный ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...