我正在尝试创建一个Electron桌面应用,其后端有一个Django应用。有几个教程和博客提到了如何实现这一目标。我已经尝试了这些并且它似乎正在起作用,但是有一些问题。
对我来说其中一个是如何在这种情况下为Django提供服务?对我来说,目前这样做的方式造成一些不必要的延迟,使得应用程序启动缓慢......
通常,创建Django / Electron应用程序需要做的是将Django应用程序打包(我使用pyInstaller)到一个独立的可执行文件中,然后将其捆绑到一个Electron应用程序中。问题是在使用pyInstaller打包之前,服务器应该使用哪个服务器来服务器Django?目前我使用cherryPy作为WSGI Web服务器来为Django提供服务。
然而 - 是否有更好的选择,知道这将用于Electron桌面应用程序?也许更快,或更适合这项任务?在这种情况下处理Django的典型方法是什么?
答案 0 :(得分:5)
首先,如果你的应用程序启动缓慢,你可以创建自定义加载动画模板,你将服务的节点,直到你的服务器准备就绪,在这种情况下你应该将BrowserWindow标志显示设置为false,你将“在自定义“server_ready”事件中显示“window.show()窗口”。你的应用程序的整体逻辑应该适合:1)你启动电子应用程序和加载服务器浏览器窗口加载...动画,然后你产生你的django应用程序将运行的子进程,在这里你有你之间的“桥梁”电子节点事件和python逻辑,完成如下:
let django=child_process.spawn('python', [__dirname+'/django_folder/start_server.py']);
现在变量django是你与django app沟通的处理程序。 您可以按如下方式进行沟通:
let result_name = '';
django.stdout.on(
'data',
(data:Buffer) => {
result_name+=data.toString('utf8');
}
);
django.stdout.on(
'end',
(reasone) => {
resolve(result);
}
);
django.stderr.on( //error in python will be directed here
'data',
(buf : Buffer) => {
reject(buf.toString('utf8'));
}
);
django.stdin.write(JSON.stringify('notify your django app what you need from it'));
在python中:
args=sys.stdin.readlines()[0] #your message in json from electron
args=json.loads(args)['data']
print result #send data back to electron
如果您的应用程序不是很复杂,您可能可以在localhost上运行, 那么你的python进程会通过事件通知你它已准备好你可以用localhost url重新加载BrowserWindow并开始协调与子进程通信的交互。