Django×Electron でデスクトップアプリ開発はできないの？ 

# はじめに

- [Django](https://www.djangoproject.com/)
- [Electron](https://electronjs.org/)

Django とは、「**PythonでWebアプリを開発する**際に使うWebフレームワーク」です。
Electron とは、「**Web技術でデスクトップアプリを作る**ことができるエンジン」です。

つまり、***Django×Electron で『Python 製のデスクトップアプリケーション』***が作れる！

## そんな……夢を見たんだ。

 - [Is it a good idea to use Django in making a desktop app? How difficult is it?](https://www.quora.com/Is-it-a-good-idea-to-use-Django-in-making-a-desktop-app-How-difficult-is-it)

なんだか良くないっぽい。
どうりで「Django Electron」や「Django デスクトップアプリ」と検索しても人気記事が出てこないわけだ。

 - [DJANGO Y ELECTRON PARA APLICACIONES MULTIPLATAFORMA](https://programadorwebvalencia.com/django-y-electron-para-aplicaciones-multiplataforma/)

一応、実践している記事があった。

せっかくなので、コードにコメントをつけてみた。

```js:ElectronのエントリポイントJS
// electron モジュールのインポート
const electron = require('electron');
const app = electron.app;
const BrowserWindow = electron.BrowserWindow;
let mainWindow;

// アプリケーションウィンドウを閉じたときの処理
app.on('window-all-closed', function () {
    // アプリケーションを終了する
    app.quit();
});

// アプリケーション起動時の処理
app.on('ready', function () {
    // child_process で python コマンドを実行する
    // jdango サーバー起動のコマンド【$ python manage.py runserver】
    var subpy = require('child_process').spawn('python', ['./manage.py', 'runserver']);
    // サーバーのアクセスURL
    var mainAddr = 'http://localhost:8000/';

    // request-promise モジュールのインポート
    var rq = require('request-promise');

    // ウィンドウ起動時の設定処理
    var openWindow = function () {
        // ウィンドウサイズなどの設定
        mainWindow = new BrowserWindow({ width: 800, height: 600 });
        // 読み込むURLを指定
        mainWindow.loadURL(mainAddr);

        // ウィンドウを閉じたときのイベント
        mainWindow.on('closed', function () {
            mainWindow = null;
            // child_process を終了する
            subpy.kill('SIGINT');
        });
    };

    // 起動処理
    var startUp = function () {
        // 読み込み終了待ち
        rq(mainAddr)
            // 読み込み完了したら……
            .then(function (htmlString) {
                console.log('server started');
                // ウィンドウを起動
                openWindow();
            })
            .catch(function (err) {
                // 404エラーとかだと、ここで無限ループして終わらない
                // だが、正常時にも何度かこのブロックを通る（なぜ？）
                startUp();
            });
    };

    // 起動
    startUp();
});
```

### 問題点
 1. 実行中はブラウザでも ```http://localhost:8000``` にアクセスできてしまう。
 2. Windows 環境では、アプリケーションを終了してもサーバーが終了しない。（child_process を終了できない）
 3. 起動速度が遅い。

と言ったところで、**Django×Electron だけ**で開発をするには少々難題がある印象であった。

### Django×Electron 開発の仕方
一応、できないことはない。

 - [Pythonでデスクトップアプリを作る with Electron](https://qiita.com/yoshizaki_kkgk/items/da9711c26e71522ad289)

こちらの記事と、上記のエントリポイント JS ファイルをあわせる感じで、Django のプロジェクトフォルダに Electron を投入すれば良い。

### Django×デスクトップアプリ

Electron に限らずとも、何らかの手法で Django 製デスクトップアプリ開発を試みる人がいても良いはずなのに、中々記事が見つからないのはなぜなのか。
やはり、Django はデスクトップアプリと相性が悪いのだろうか。

詳しくは理解できていません……orz


## Django製デスクトップアプリ開発の最適解？

 - [Building Future Web Apps With JavaScript and Django](https://medium.com/fbdevclagos/building-future-web-apps-with-javascript-and-django-c831883b22cf)
 - [Django REST Framework の使い方メモ](https://qiita.com/__init__/items/f5a5a64a05541fcda713)

色々調べてみたところ、「**Django で API を作成し、Web アプリのバックエンドを担わせる**」という手段がある模様（さらに **Django REST Framework** を使えば API 作成が簡単に）。

つまり……

 - **React（フロントエンド）**
 - **Django + REST Framework（バックエンド）**
 - **Electron（Web アプリをデスクトップアプリ化）**



という組み合わせが最適解？

# 蛇足

いや、でも React×Electron なら、Webpack と Babel もつけたほうが……

***React × Webpack × Babel × Django × Rest Framework × Electron***

仰々しくなった。

# 参考文献
 - [Is it a good idea to use Django in making a desktop app? How difficult is it?](https://www.quora.com/Is-it-a-good-idea-to-use-Django-in-making-a-desktop-app-How-difficult-is-it)
 - [Building Future Web Apps With JavaScript and Django](https://medium.com/fbdevclagos/building-future-web-apps-with-javascript-and-django-c831883b22cf)
 - [Django REST Framework の使い方メモ](https://qiita.com/__init__/items/f5a5a64a05541fcda713)
 - [DJANGO Y ELECTRON PARA APLICACIONES MULTIPLATAFORMA](https://programadorwebvalencia.com/django-y-electron-para-aplicaciones-multiplataforma/)
 - [bottle×Electronで簡単！PythonのGUIアプリ開発](https://qiita.com/RyuSA/items/b9ff8d5ecc6f47d46a99)
 - [Pythonでデスクトップアプリを作る with Electron](https://qiita.com/yoshizaki_kkgk/items/da9711c26e71522ad289)