R

ReflexKR

Reflex公式ドキュメント

Reflexで始めるPythonフルスタックWeb開発

·

講座の概要

1

Reflexの紹介と開発環境

2

コンポーネントで画面を描く

3

StateとVar:データに画面を描かせる

4

イベントとフォーム:顧客を追加する

5

データ加工とチャート

6

まとめ、デバッグ、次のステップ

·

付録

Reflexで始めるPythonフルスタックWeb開発
6限目

時間 3:45–4:00

まとめ、デバッグ、次のステップ

今日作ったアプリは、状態(State)→ 画面(Var)→ イベント(ハンドラ)→ 状態の変更という1つのループで動いています。Reflexのアプリはどれだけ大きくなっても、このループが増えていくだけです。

6-1. 今日学んだことを1つの表に (5分)

概念コードでは覚えておきたい一言
コンポーネントrx.box(子要素, 属性=値)位置引数は子要素、キーワード引数は属性
ページapp.add_page(index, on_load=...)1ページ=1関数
Stateclass State(rx.State)型アノテーションは必須、セッションごとのサーバーメモリ
VarState.users.length()画面の関数の中では値ではなく式
繰り返し・条件rx.foreach, rx.condVarにはfor、ifの代わりにこれを使う
イベント@rx.event def add_user(self, ...)状態を変える唯一の方法、中身は本物のPython
フォームrx.form(on_submit=...) + name=nameがform_dataのキーになる
制御コンポーネントopen= + on_open_change=セッターは自分で定義する(0.10)
computed var@rx.var def ...() -> 型ほかの状態から計算される値
チャートrx.recharts.bar_chart(data=...)データはlist[dict]

6-2. よくあるミスと解決策 (5分)

症状原因解決策
TypeError: object of type '...Var' has no len()画面の関数でVarにlen()を使った.length()
VarTypeError: Cannot convert Var ... to boolVarにif / and / orを使ったrx.cond(...)
VarTypeError: Cannot iterate over VarVarにforを使ったrx.foreach(...)
AttributeError: ... has no attribute 'set_xxx'自動セッターがあると思い込んでいる(古い資料)@rx.eventでセッターを自分で定義
キャンセルボタンを押してもデータが追加されるフォーム内のボタンの既定のtypeがsubmittype="button"
TypeError: __init__() got an unexpected keyword argument入力欄のnameとdataclassのフィールド名が一致していない名前をそろえる
ダイアログが開かないopen=だけがありon_open_changeがない2つをセットで使う
チャートが空のままチャートのデータを入れるタイミングがないon_loadに登録するか、computed varにする

デバッグの3つの習慣

  1. まずサーバーのターミナルのログを見ます。ハンドラで起きた例外は画面にはっきり表示されず、ターミナルにだけ出力されることがよくあります。
  2. uv run reflex compile --dryで先にチェックします。サーバーを起動せずに、画面コードの文法エラーやVarのエラーを素早く見つけられます。
  3. ハンドラの中にprint()を入れます。ハンドラはサーバーで動くPythonなので、print(form_data)はサーバーのターミナルに出力されます。画面の関数の中のprintは、アプリの起動時に一度だけ出力されます。

6-3. 発展課題(宿題)

難易度の低い順に並べています。どの課題も、今日学んだ概念の1つをさらに深く使います。

  1. 削除ボタン:各行の末尾にゴミ箱アイコン(rx.icon("trash-2"))を置き、押すとその顧客を削除します。ヒント:on_click=lambda: State.delete_user(user.email)のように引数を渡します。
  2. 検索:名前の検索欄を作ってvalue=+on_change=(制御コンポーネント)でつなぎ、computed varで絞り込んだ一覧をテーブルに表示します。on_change=State.set_search.debounce(300)として、入力が止まってから検索するようにしてみましょう。
  3. 入力の検証:メールアドレスの重複や形式の誤りがあればrx.toast.errorを返し、ダイアログは閉じないようにします。
  4. 永続化:SQLModelでCustomerテーブルを作り、on_loadで読み込んでadd_userで書き込みます。再読み込みやサーバーの再起動のあとも、顧客が残っている必要があります。インストールはuv add "reflex[db]"で行います。Reflex 0.10では、rx.Modelの代わりにSQLModelを直接使うことが推奨されています。

6-4. 次に学ぶこと

  • 複数ページとルーティング:@rx.page(route="/customers/[id]")のような動的なパスを作り、顧客の詳細ページを追加します。
  • ファイルの分割:models.py、state.py、components/、pages/に分けて、規模が大きくなっても管理しやすくします。
  • デプロイ:reflex run --env prodで本番モードを確認し、Reflex Cloudや自前のサーバー(Docker)にデプロイします。
  • 公式ドキュメント:reflex.dev/docs。古いブログ記事には、自動セッター、rx.Model、rx.App(theme=...)など、すでに変更されたAPIが使われていることがあるので、バージョンを確認してから読みましょう。

← 前へ

5限目 · データ加工とチャート

次へ →

付録

新しい授業・講座のお知らせを受け取る

この講座に授業が追加されたり、続きの講座が公開されたりしたらメールでお知らせします。

収集項目:メールアドレス・目的:この講座の新しい授業・公開のお知らせ・保有期間:解除のご依頼まで。他の目的には使わず、第三者にも提供しません。お知らせメールに返信いただければすぐに削除します。

質問と回答

この回について気になることを書き込んでください。すべての言語のページの質問がここに集まります。

リンクや書式なしで、そのままの文字で表示されます。

R

ReflexKR

触って学ぶPythonとReflex。すべての例はReflex 0.10.0で実際に動かして確認しています。

ReflexKRはバナー広告なし・無料で運営しています。役に立ったら、コーヒー一杯で応援してください。 ☕ コーヒーで応援する

アフィリエイトと支援について
한국어English日本語简体中文EspañolDeutsch

© 2026 ReflexKR · Since 2026 · CC BY-NC 4.0

Built with Reflex