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


はじめに

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

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

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

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

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

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

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 開発の仕方

一応、できないことはない。

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

Django×デスクトップアプリ

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

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

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

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

つまり……

  • React(フロントエンド)
  • Django + REST Framework(バックエンド)
  • Electron(Web アプリをデスクトップアプリ化)

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

蛇足

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

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

仰々しくなった。

参考文献