Next.js / Python Flask / SQLite3

前回、PyCharmを使ったスタンドアローンGUIのPythonプログラミンングを試しましたが、今回はこの環境でWebプログラミングをしてみます。
UIをPythonでやることもできますが、やはりJavaScriptの利便性には敵いませんので、今一番よく使われているReactのWebフレームであるNext.jsを使用します。

環境) Next.js v14.0.2 / node v18.12.1, npm(npx) v8.19.2 / Python v3.9.6 / PyCharm 2023.2.4 CE, sqlite3 v3.39.5 / Mac(arm64)

Reactについて過去記事

React.js / CodeSandbox

データベースはSQLite3を使用します。これでWebアプリの最小限の機能を実現できます。

参考) https://zenn.dev/ovrsa/articles/6e66c50f3b3429

今回一番やりたかったことは、FrontEndをnode.jsで動かすのではなく、PythonのサーバにNext.jsのコードを静的ファイルとしてデプロイして動作させることです。そして一歩進んで、実行ファイル化して実行するテストもしました。(コンソール起動、ダブルクリック起動) この時、SQLite3のDBファイルのパスについていろいろと考慮する必要がありました。

app.py

staticフォルダに下記ビルド結果のoutフォルダの中身をコピーして持ってきます。
実行ファイル化したときの、staticファイルをコマンドで指定するか、コードで明記するかや、dbファイルの場所も、カレントかユーザルートか、を変更するため、コメント部分はあえて残しました。

next.js環境構築

npx create-next-app frontend
cd frontend
npm install


pages/index.js

ステートフックと副作用フックのおかげでとてもシンプルにコーディングできることがわかります。
データのあるべき姿を記述すれば、変化があったときに関連する部分が自動的に更新されます。(リアクティブの特徴)

“npm run dev”の実行時、コンフリクトのエラーが出るため、app/page.js を無効にするか、リネームします。

ビルド設定

next.config.js

ビルド実行

npx next build


outフォルダに生成されるファイルをapp.pyと同階層にあるstaticフォルダにコピーします。

(参考までにindex.htmlを確認)
% tidy -raw -i out/index.html
…(略)…

…(略)…

Static Site Generation(SSG)、またブラウザにファイルをロード後JavaScriptでのレンダリングを意図しているので、Client Side Rendering(CSR) ということを確認できます。レンダリングするので広い意味で動的か、と誤解しそうになりますが、HTMLファイルを静的に生成した、という部分がメインということでしょう。(JSX、トランスパイル、nodejsのおかげで、Web界隈はかなり複雑になってきています。)

nodejsで実行(一応確認のため)

npm run dev



デフォルトでは、staticは不要ですが、ここではexport時にPythonが静的ファイルとしてアクセスするためのPathと合わせるためにこのようになっています。

Flaskサーバ実行

python app.py


app.pyと同階層のinstanceフォルダに、demo.dbが作成されます。

Flaskサーバにアクセス

誤解のないように補足いたします。
上記二つとも同じ内容を表示していますが、複製していますので、ソースは違います。(データベースは同じもの)またFlaskサーバのみで実行できます。Nodejsサーバで内容を確認するときはFlaskサーバの起動が必要です。

AddItemボタンでデータを追加した結果のDB

% sqlite3 demo.db
sqlite> .mode column
sqlite> .table
item
sqlite> .schema
CREATE TABLE item (
id INTEGER NOT NULL,
name VARCHAR(80) NOT NULL,
PRIMARY KEY (id)
);
sqlite> select * from item;
id name
— —-
1 aaaa
2 bbbb
3 cccc
4 1111
sqlite>

Pythonファイルの実行形式化

pyinstaller -F –add-data “static:static” –onefile –clean app.py

distフォルダに 実行ファイルapp が出力されます。–noconsole オプションをつけると起動時コンソールが表示されなくなり、出力ファイルのMacのパッケージになリ、このときDBファイルはパッケージの中に書かれます。Finderからダブルクリック起動の場合は、カレントでなくユーザルートに書かれます。

(最後にWeb画面に表示されたデータが思ったものと違ったので確認しました。PythonのQueryで取得したまま表示されています。
今回はここまでとします。)