web-dev-qa-db-ja.com

配信方法Django Electronアプリの場合

Electron デスクトップアプリを作成しようとしています。バックエンドに Django アプリケーションがあります。これを実現する方法を説明するチュートリアルとブログがいくつかあります。私はそれらを試してみましたが、動作しているようですが、いくつかの問題があります。

私にとってそれらの1つは、この場合にDjangoをサーバーで処理する方法ですか?私にとって現在の方法では、不要な遅延が発生し、アプリの起動が遅くなります...

一般に、Django/Electronアプリを作成するために必要なことは、スタンドアロンの実行可能ファイルにDjangoアプリをパッケージ化して( pyInstaller を使用して)、それをバンドルすることです電子アプリに。問題は、pyInstallerでパッケージ化する前に、この場合にサーバーDjangoに使用するサーバーを指定することです。現時点では、Djangoを提供するWSGI Webサーバーとして cherryPy を使用しています。

ただし、これがElectronデスクトップアプリで使用されることを知っているより良い代替策はありますか?多分もっと速い、またはこのタスクにより適していますか?この場合のDjangoの一般的な処理方法は何ですか?

10
user1544500

まず、アプリの起動が遅い場合は、サーバーの準備ができるまでサービスを提供するノードを使用して、カスタムの読み込みアニメーションテンプレートを作成できます。この場合、BrowserWindowフラグの表示をfalseに設定する必要があります。カスタム「server_ready」イベントでwindow.show()を使用したウィンドウ。アプリの全体的なロジックは次のように収まるはずです:1)electronアプリを起動し、ロード時にブラウザーウィンドウを読み込んでいます...アニメーションを実行し、次に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を再読み込みして対話の調整を開始できる準備ができていることを通知します子プロセスとの通信。