如何为 Electron 应用程序服务 Django

Posted

技术标签:

【中文标题】如何为 Electron 应用程序服务 Django【英文标题】:How to serve Django for an Electron app 【发布时间】:2017-10-31 11:07:38 【问题描述】:

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

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

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

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

【问题讨论】:

您能否澄清一下您到底想实现什么,第一个猜测:您正在构建独立应用程序,它将与其他地方的 django 服务器通信,第二个猜测:您正在尝试为您的桌面形式的所有包含功能的 django 应用程序? 嗨,很抱歉我的问题不清楚。确实 - 我想要实现的是你的第二个猜测 - 创建一个桌面应用程序,其中电子包装 Django。 【参考方案1】:

首先,如果您的应用程序启动缓慢,您可以创建带有节点的自定义加载动画模板,您将在服务器准备好之前提供该模板,在这种情况下,您的 BrowserWindow 标志显示应设置为 false,您将“在您的自定义“server_ready”事件中使用 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

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

【讨论】:

你在这里生成了 python spawn('python'...。我将如何部署该软件包?例如,我使用带有virtualenv 的python。而电子似乎会产生ENOENT 错误。因为,以为它会将所有代码复制到resources 文件夹中,它似乎找不到它。

以上是关于如何为 Electron 应用程序服务 Django的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Electron 重建原生 npm 模块?

如何为 Electron / Atom Shell App 设置应用程序图标

如何为Electron / Atom Shell App设置应用程序图标

Electron builder - 如何为生产 Windows 可执行文件构建 loadURL

如何为 electron + react js + next 进行生产构建

Electron.js:如何为一个窗口创建一个单独的下载 webContents.session?