2024.9.7:Anvilについて追記しました。
2024.8.6:FastHTMLについて追記しました。
※本記事で言及しているReflexのdiscordサーバー内に日本語チャンネルをつくってもらいました。もし、興味をもった人がいたら参加してみてください。
1.PythonだけでWebアプリをつくるライブラリが増えている
最近(2024.05)、Python界隈ではPythonだけでWebアプリが作れるライブラリが増えています。詳しくは他の記事を参照してもらえればと思います。
以下の記事がとても参考になりました。ありがとうございます。
2.ライブラリの分類
こうしたライブラリも大きくわけて2つの種類があるように思います。
①データ解析の結果を表示するダッシュボードライブラリ
②汎用的なWebアプリをつくるローコードライブラリ
①ダッシュボード系ライブラリ
たとえば、上記の記事にも出てきますし、ネットでもかなり情報の多い、StreamlitやDashは項番1のダッシュボードライブラリに該当すると思います。
PandasのDataframeをつかって、表やグラフが簡単にできます。
Pythonを使う人のなかでもデータ解析をしている人にとっては、Webアプリを作るというのはメインのタスクではなく、サブタスクに過ぎません。
可視化をしたり、人と情報共有するためにWebアプリは便利ですが、TypeScriptをつかって、ビルドの準備して、バックエンドのAPI用意してとかしてたら、データ解析というメインタスクに支障を来します。
そこで、StreamlitやDashなどのPythonだけでコーディングできて、フロントのビルドの準備もせず、コンポーネントも作らず、簡単にWebアプリが作れるライブラリのニーズが高いのだと思います。
上記のライブラリは、データ解析系のダッシュボードを作るには便利なのですが、業務系のWebアプリをつくるとなるとややカスタマイズが大変な部分もあります。
まだ発展途上なので、そのうち汎用的なWebアプリの開発ニーズを満たす機能が実装されるかもしれません。ただ、現時点(2024.05)では、その機能は不足しているように思います。
②汎用的なWebアプリをつくるローコードライブラリ
データ解析用のダッシュボードではなく、業務系のWebアプリがつくりたい場合のライブラリもPythonにはあります。たとえば、ReflexやFletが挙げられます。
Reflex
Reflexは、PythonをつかってReactライクなコーディングで画面を作成することができます。ある程度コンポーネントも作ってくれているので、呼び出すだけでコンポーネントを表示できます。
Reactの良さは、JavaScriptやTypeScriptのコンテキストですべてをかけることによる、認知や作業の負担軽減だと思います。
ReflexはそれをPythonで実現していると思います。
Flet
もう一つはFlet。こちらはReflexとは趣が違っていて、Webアプリだけでなく、スマホアプリも作れます。というか、PythonでコーディングしてFlutterのコードを生成しているようです。
Flutterも最近は様々なプロダクションに使われていますが、それをPythonだけで作れるのはかなり魅力的だと思います。私はまだ触っていないですが、そのうち触ってみたいと思います。
これらのライブラリは、ダッシュボードライブラリとは違っていて、汎用的なWebアプリがつくれるような設計になっています。
たとえば、ログイン画面の実装、メニューの配置とか、Webアプリをつくっていると実装しないといけないものを独自のカスタマイズではなく、ライブラリの想定する設計に即してコーディングできます。
ダッシュボードライブラリではなく、Webアプリが作りたいならReflexやFletのような汎用的なWebアプリ用のローコードライブラリを使うのがよいと思います。
FastHTML
(2024.8.6追記)FastHTMLというReflexと似たようなライブラリがあります。見た感じかなりシンプルですね。
Anvil
ドラッグアンドドロップで画面を作れて、アクションをPythonでコーディングするAnvilというサービスもあります。こちら、オンプレへのデプロイもできたり、Gitでのソース管理もできます。
※こちらはライブラリではなく、Webサービス。
編集画面は以下。
アクションはPythonでコーディング。
3.何故、一言語だけでアプリが作れるライブラリが増えているのか?
最近は、RailsのHotwireやLaravelのLivewireなど、脱JavaScript/TypeScript、脱フロントビルド準備などがWeb開発の現場で少しずつ見られるようになってきました。
もう20年近くWeb開発していますが、ビルドを伴うWebのフロント開発は、準備、コーディングが結構大変だと感じます。それに加えて、UI特有の設計の問題、ブラウザへの対応など、やることてんこ盛りです。正直、どの領域でもいいので、楽をしたいのがプログラマーの本音ではないでしょうか?
少なくとも私はそう感じています。
これへの解決方法として生まれたのが、前述のHotwireやLivewireなど、あらかじめビルドの準備はしてくれていて、一つの言語だけでコーディングできる技術セットではないでしょうか?
そして、本記事でとりあげたPythonのWeb系ライブラリは、コンポーネントの開発までしてくれています。もう、ユーザーの要件定義と基本設計(外部設計)さえしたらコーディングに取りかかれるレベルです。
上記で言及したPython、Ruby、PHPで触れたWebアプリを簡単につくれる技術は、最終的に、JavaScript、HTML、CSSを生成しているので、ビルドを準備してTypeScriptで開発する方法と成果物は変わりません。
準備やコーディングの仕方が変わっているだけです。
たとえば、StreamlitやReflexは、コンポーネントの実装は、Reactがつかわれていたり、ReflexはNextJSをフロントのフレームワークとして利用しています。
成果物が同じなら、準備や製造が楽に越したことはありません。
ちなみに、StreamlitやReflexは、Reactでのカスタマイズもできますので、いざとなれば複雑なものはTypeScriptやJavaScriptでつくればよいです。
経験的に、業務アプリだとそこまでカスタマイズでつくるものはないと思います。
4.業務アプリをPythonのライブラリでつくるメリット
RubyやPHPでもWebアプリを簡単につくれる技術があります。
ただ、業務アプリを作る上でPythonで作るほうが良い点があります。
それは、Pandasなどのデータや表を扱うライブラリやExcelを操作するライブラリが充実していることです。
StreamlitやReflexは、PandasのDataFrameをつかえばすごく簡単に表が作れてしまいます。
業務アプリにおいて表を使わないものは皆無に等しいでしょう。
そして、意外とつくるのがめんどくさいものです。かぎりなくExcelに近づけてくれという要望も高いです。
StreamlitやReflexはこうしたニーズに比較的容易に対応できます。
こうしたことからPythonのWebアプリライブラリの方が業務アプリには向いているなと感じます。
たとえば、Reflexは以下のコードだけでCSVから表をつくることができます。
import pandas as pd
nba_data = pd.read_csv("https://media.geeksforgeeks.org/wp-content/uploads/nba.csv")"""
...
rx.data_table(
data = nba_data[["Name", "Height", "Age"]],
pagination= True,
search= True,
sort= True,
)
上記は、以下の公式から引用しました。
あと、Reflexについては、FastAPI、SQLAlchemy、Alembic、Pydanticなどをラッピングしており、Router、ORM、Migration、Validationの機能もついています。
PythonのWebアプリライブラリは、かなり必要なことを踏まえつつコーディング量を減らしてくれるのでとても便利だなという気がします。
補足:業務アプリを作る際の体験談
以前、Streamlitで業務アプリを作ってみました。その結果、ログイン画面の実装やテーブルの日本語入力でいろいろとカスタマイズが必要になりました。
やはりダッシュボードライブラリではなく、汎用的なWebアプリライブラリを使わないといけないんだと感じて、今は、Reflexを触っています。
Streamlitも純粋にデータ解析用のダッシュボードをつくるのであれば問題ないと思います。とても人気のあるライブラリですし、今後もますます機能が充実していくと思います。
Stremlitはこの領域においては、かなり有名でダウンロード数も月に数百万もあります。
しかし、Streamlitの機能充実を待たず、今すぐ工数の少ないアプリをつくりたいと考え、今はReflexでの開発をしています。まだ、細かいところは不満もありますが、Streamlitよりはかなりスムーズに実装ができています。
細かい不満はHotreloadが少しだけ遅い点とドキュメントや情報が少ない点でしょうか。
ただ、この点については、そこまで開発の支障にはなってないです。Reflexはまだメジャーバージョンではないですが、今後の発展の中でこれらは解消していくのではと期待しています。
Githubのスターの数も16Kで、Streamlitの31Kには及びませんが、2022年にリリースしたことを考えるとかなり早く多くのスターを獲得してると思います。
Reflexはライブラリと同名の会社が開発をしています。この会社はYCombinatorなどのベンチャーキャピタルからの投資を受けており、今後の発展を期待しています。
Today, the company announced a $5 million seed investment.
Web開発で必要となることはだいたいできています。また、コーディング量も少なくなり、比較的わかりやすいモジュール構成になるので、メンテをするにもメリットが有ると感じます。
まだまだ日本語の情報が少ないので、私の方でも少しずつ知見を投稿して日本でも広まるようになればと思います。
補足2:Reflexに関する記事
ReflexのREADMEについて、日本語訳が追加されました。
DBをつかったアプリを作る際に参考にした情報を記事にしました。
Reflexのサーバサイドの挙動が気になったので記事にしました。
ReflexのREADMEを和訳して下さった方のReflex の紹介記事です。
ReflexでDBマイグレーションをする方法を説明した記事です。