Electron内嵌Python Flask服务器无法访问,出现net::ERR_CONNECTION_REFUSED错误
Electron中启动Flask服务器出现连接拒绝问题排查
执行npm run start可正常启动Electron应用,但访问Flask路由时显示错误:(failed) net::ERR_CONNECTION_REFUSED,怀疑Flask服务器未正常启动,以下是排查和解决方法:
文件夹结构
- 项目根目录:包含
flask_server文件夹、index.html、main.js、package.json、preload.js、renderer.js flask_server文件夹:内部存放Flask入口文件main.py
现有代码
Electron主进程文件 main.js
const { app, BrowserWindow } = require('electron'); const path = require('path'); const { spawn } = require('child_process') const createWindow = () => { const win = new BrowserWindow({ width: 800, height: 600, webPreferences: { preload: path.join(__dirname, 'preload.js'), }, }); win.loadFile('index.html'); }; app.whenReady().then(() => { spawn("python", ["./flask_server/main.py"]) createWindow(); app.on('activate', () => { if (BrowserWindow.getAllWindows().length === 0) { createWindow(); } }); }); app.on('window-all-closedUse', () => { if (process.platform !== 'darwin') { app.quit(); } });
Electron页面文件 index.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'" /> <meta http-equiv="X-Content-Security-Policy" content="default-src 'self'; script-src 'self'" /> <title>My Test App</title> </head> <body> <h1>Hello from Electron renderer!</h1> <p>👋</p> <p id="info"></p> <br><a href="http://127.0.0.1:5000/">Go</a> </body> <script src="./renderer.js"></script> </html>
Flask服务器文件 flask_server/main.py
import sys from flask import Flask from flask_cors import CORS app = Flask(__name__) CORS(app) @app.route("/") def hello(): return "Hello World from Flask!" if __name__ == "__main__": app.run(host='127.0.0.1', port=5000)
问题原因及解决方法
1. Python命令兼容性问题
不同系统中Python的命令可能是python或python3,直接用"python"可能导致找不到解释器,服务器启动失败。
2. 相对路径错误
spawn的工作目录可能不是项目根目录,用相对路径./flask_server/main.py可能找不到文件,应该使用绝对路径。
3. 未捕获子进程启动错误
没有监听子进程的标准输出和错误输出,无法排查启动失败的具体原因。
4. Electron事件名称错误
app.on('window-all-closedUse'存在拼写错误,应为window-all-closed,会导致窗口关闭逻辑异常。
修改后的main.js代码
const { app, BrowserWindow } = require('electron'); const path = require('path'); const { spawn } = require('child_process') const createWindow = () => { const win = new BrowserWindow({ width: 800, height: 600, webPreferences: { preload: path.join(__dirname, 'preload.js'), }, }); win.loadFile('index.html'); }; app.whenReady().then(() => { // 兼容python/python3命令 const pythonCmd = process.platform === 'win32' ? 'python' : 'python3'; // 使用绝对路径指向main.py const flaskPath = path.join(__dirname, 'flask_server', 'main.py'); const flaskProcess = spawn(pythonCmd, [flaskPath]); // 监听子进程输出,排查问题 flaskProcess.stdout.on('data', (data) => { console.log(`Flask输出: ${data}`); }); flaskProcess.stderr.on('data', (data) => { console.error(`Flask错误: ${data}`); }); flaskProcess.on('close', (code) => { console.log(`Flask进程退出,码值: ${code}`); }); createWindow(); app.on('activate', () => { if (BrowserWindow.getAllWindows().length === 0) { createWindow(); } }); }); // 修复事件名称拼写错误 app.on('window-all-closed', () => { if (process.platform !== 'darwin') { app.quit(); } });
额外检查项
- 确认已安装Flask依赖:在
flask_server目录下执行pip install flask flask-cors - 手动运行
python flask_server/main.py,确认Flask能正常启动,访问http://127.0.0.1:5000能看到返回内容
内容的提问来源于stack exchange,提问作者Suresh
相关产品推荐
相关产品推荐

