はじめに
Django とは、「PythonでWebアプリを開発する際に使うWebフレームワーク」です。
Electron とは、「Web技術でデスクトップアプリを作ることができるエンジン」です。
つまり、***Django×Electron で『Python 製のデスクトップアプリケーション』***が作れる!
そんな……夢を見たんだ。
なんだか良くないっぽい。
どうりで「Django Electron」や「Django デスクトップアプリ」と検索しても人気記事が出てこないわけだ。
一応、実践している記事があった。
せっかくなので、コードにコメントをつけてみた。
// 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();
});
問題点
- 実行中はブラウザでも
http://localhost:8000
にアクセスできてしまう。 - Windows 環境では、アプリケーションを終了してもサーバーが終了しない。(child_process を終了できない)
- 起動速度が遅い。
と言ったところで、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
仰々しくなった。