10
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

はじめに

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

仰々しくなった。

参考文献

10
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?