如何为电子应用程序提供Django服务

use*_*500 8 javascript python django node.js electron

我正在尝试创建一个Electron桌面应用程序,它的后端有一个Django应用程序.有几个教程和博客提到了如何实现这一目标.我已经尝试了这些并且似乎有效,但是有一些问题.

对我来说其中一个是如何在这种情况下为Django服务器?对我来说,目前的做法造成一些不必要的延迟,使应用程序启动缓慢......

通常,创建Django/Electron应用程序需要做的是将Django应用程序打包(我使用pyInstaller)到一个独立的可执行文件中,然后将其捆绑到Electron应用程序中.问题是在使用pyInstaller打包之前,服务器应该使用哪个服务器来服务器Django?目前我正在使用cherryPy作为WSGI Web服务器来为Django提供服务.

但是 - 有没有更好的选择,知道这将用于Electron桌面应用程序?也许更快,或更适合这项任务?在这种情况下处理Django的典型方法是什么?

Ana*_*ich 7

首先,如果您的应用启动缓慢,则可以使用将要使用的节点创建自定义的加载动画模板,直到服务器准备就绪为止,在这种情况下,应将BrowserWindow标志的show设置为false,然后将“显示”自定义“ server_ready”事件上包含window.show()的窗口。您的应用程序的总体逻辑应符合以下条件:1)启动电子应用程序,并在加载时加载带有动画的浏览器窗口,然后生成django应用程序将在其中运行的子进程,在此之间有一个“桥梁”电子节点事件和python逻辑,其操作如下:

let django=child_process.spawn('python', [__dirname+'/django_folder/start_server.py']); 
Run Code Online (Sandbox Code Playgroud)

现在,变量django是您与django应用通信的处理程序。您可以进行如下交流:

            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'));
Run Code Online (Sandbox Code Playgroud)

在python中:

args=sys.stdin.readlines()[0] #your message in json from electron
args=json.loads(args)['data'] 
print result #send data back to electron
Run Code Online (Sandbox Code Playgroud)

如果您的应用程序不是很复杂,您可能可以在localhost上运行,那么您的python进程将通过事件通知您它已准备就绪,您可以使用localhost url重新加载BrowserWindow并开始协调与子进程通信的交互。