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

2024-05-20 19:36:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个Electron桌面应用程序,它的后端有一个Django应用程序。有几个教程和博客提到如何实现这一点。我已经试过了,看起来很管用,但也有一些问题。

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

一般来说,创建Django/Electron应用程序需要做的是将Django应用程序打包(我正在使用pyInstaller)到一个独立的可执行文件中,然后将其捆绑到一个Electron应用程序中。问题是,在用pyInstaller打包Django之前,应该使用哪个服务器来处理这个案例?目前,我使用cherryPy作为WSGI web服务器来服务Django。

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


Tags: django服务器web应用程序可执行文件wsgi电子情况
1条回答
网友
1楼 · 发布于 2024-05-20 19:36:19

首先,如果应用程序启动缓慢,可以使用节点创建自定义加载动画模板,直到服务器准备就绪,在这种情况下,应将BrowserWindow flag show设置为false,然后在自定义“服务器准备就绪”事件上使用window.show()显示窗口。你的应用程序的整体逻辑应该符合:1)你启动电子应用程序和加载服务浏览器窗口加载。。。动画,然后生成django应用程序将在其中运行的子进程,在这里,您有电子节点事件和python逻辑之间的“桥梁”,如下所示:

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

现在变量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'));

在python中:

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

如果你的应用程序不是很复杂,你可以在本地主机上运行, 因此,python进程将通过事件通知您它已经准备好了,您可以用localhost url重新加载BrowserWindow,并开始协调与子进程的交互。

相关问题 更多 >