LoginSignup
16
30

Reflexライブラリについて

Posted at

お疲れ様です。

今日は「Reflexライブラリ」について部分いたします。

Reflex

ReflexはPythonのみでフルスタックWebアプリケーションを作成できるライブラリです。

主な特徴:

  • Pure Python - WebアプリケーションのフロントエンドとバックエンドをPythonのみで実装できるため、Javascriptを学ぶ必要がありません。
  • 高い柔軟性 - Reflexは簡単に始められて、複雑なアプリケーションまで作成できます。
  • 即時デプロイ - ビルド後、すぐにデプロイが可能です。単純なCLIコマンドを使ったアプリケーションのデプロイや、自身のサーバーへのホストができます。

Reflexがどのように動作しているかを知るには、アーキテクチャページをご覧ください。

⚙️ インストール

ターミナルを開いて以下のコマンドを実行してください。(Python 3.8以上が必要です。):

pip install reflex

🥳 最初のアプリケーションを作ろう

reflexをインストールすると、reflexのCLIツールが自動でインストールされます。

新しいプロジェクトを作成して、インストールが成功しているかを確認しましょう。(my_app_nameを自身のプロジェクト名に書き換えて実行ください。):

mkdir my_app_name
cd my_app_name
reflex init

上記のコマンドを実行すると、新しいフォルダにテンプレートアプリを作成します。

下記のコマンドを実行すると、開発モードでアプリを開始します。

reflex run

http://localhost:3000 にアクセスしてアプリの動作を見ることができます。

my_app_name/my_app_name.pyのソースコードを編集してみましょう!Reflexはfast refreshなので、ソースを保存した直後に変更がWebページに反映されます。

🫧 実装例

実装例を見てみましょう: DALL·Eを中心とした画像生成UIを作成しました。説明を簡単にするためにここではOpenAI APIを呼んでいますが、ローカルで動作している機械学習モデルに置き換えることも可能です。

 

DALL·Eのフロントエンドラッパーです。画像を生成している過程を表示しています。

 

画像生成UIのソースコードの全貌を見てみましょう。下記のように、単一のPythonファイルで作れます!

import reflex as rx
import openai

openai_client = openai.OpenAI()


class State(rx.State):
    """アプリのステート"""

    prompt = ""
    image_url = ""
    processing = False
    complete = False

    def get_image(self):
        """プロンプトからイメージを取得する"""
        if self.prompt == "":
            return rx.window_alert("Prompt Empty")

        self.processing, self.complete = True, False
        yield
        response = openai_client.images.generate(
            prompt=self.prompt, n=1, size="1024x1024"
        )
        self.image_url = response.data[0].url
        self.processing, self.complete = False, True


def index():
    return rx.center(
        rx.vstack(
            rx.heading("DALL-E", font_size="1.5em"),
            rx.input(
                placeholder="Enter a prompt..",
                on_blur=State.set_prompt,
                width="25em",
            ),
            rx.button("Generate Image", on_click=State.get_image, width="25em"),
            rx.cond(
                State.processing,
                rx.chakra.circular_progress(is_indeterminate=True),
                rx.cond(
                    State.complete,
                    rx.image(src=State.image_url, width="20em"),
                ),
            ),
            align="center",
        ),
        width="100%",
        height="100vh",
    )

# ステートとページをアプリに追加
app = rx.App()
app.add_page(index, title="Reflex:DALL-E")

それぞれの実装を見てみましょう

DALL-E appのフロントエンドとバックエンドのパーツの違いを説明しています。

Reflex UI

UIから見てみましょう。

def index():
    return rx.center(
        ...
    )

index関数において、アプリのフロントエンドを定義しています。

フロントエンドを実装するにあたり、centervstackinputbuttonなど異なるコンポーネントを使用しています。コンポーネントはお互いにネストが可能であり、複雑なレイアウトを作成できます。また、keyword argsを使うことで、CSSの機能をすべて使ったスタイルが可能です。

Reflexは60を超える内臓コンポーネントがあるため、すぐに始められます。私たちは、積極的にコンポーネントを追加していますが、簡単に自身のコンポーネントを追加することも可能です。

ステート

Reflexはステートの関数を用いてUIを表示します。

class State(rx.State):
    """アプリのステート"""
    prompt = ""
    image_url = ""
    processing = False
    complete = False

ステートでは、アプリで変更が可能な全ての変数(varsと呼びます)と、varsの変更が可能な関数を定義します。

この例では、ステートをpromptimage_urlで構成しています。そして、ブール型のprocessingcompleteを用いて、プログレスサークルと画像の表示を切り替えています。

イベントハンドラ

def get_image(self):
    """プロンプトからイメージを取得する"""
    if self.prompt == "":
        return rx.window_alert("Prompt Empty")

    self.processing, self.complete = True, False
    yield
    response = openai_client.images.generate(
        prompt=self.prompt, n=1, size="1024x1024"
    )
    self.image_url = response.data[0].url
    self.processing, self.complete = False, True

ステートにおいて、ステートのvarsを変更できるイベントハンドラ関数を定義しています。イベントハンドラはReflexにおいて、ステートのvarsを変更する方法です。ボタンクリックやテキストボックスの入力など、ユーザのアクションに応じてイベントハンドラが呼ばれます。

DALL·E.アプリには、OpenAI APIからイメージを取得するget_image関数があります。イベントハンドラの最後でUIの更新がかかるため、関数の途中にyieldを入れることで先にUIを更新しています。

ルーティング

最後に、アプリを定義します。

app = rx.App()

アプリにページを追加し、ドキュメントルートをindexコンポーネントにルーティングしています。更に、ページのプレビューやブラウザタブに表示されるタイトルを記載しています。

app.add_page(index, title="DALL-E")

ページを追加することで、マルチページアプリケーションを作成できます。

📑 リソース

📑 Docs   |   🗞️ Blog   |   📱 Component Library   |   🖼️ Gallery   |   🛸 Deployment  

✅ ステータス

2022年12月に、ReflexはPyneconeという名前でローンチしました。

2024年2月に、ホスティングサービスをアルファ版でリリースしました!アルファ版では、だれでもReflexアプリケーションを無料でデプロイできます。今後の予定はロードマップにおいて見れます。

Reflexは毎週、新しいリリースや機能追加を行っています!最新情報を逃さないために、 :star: Starや :eyes: Watchをお願いします。

コントリビュート

様々なサイズのコントリビュートを歓迎しています!Reflexコミュニティに入るための方法を、いくつかリストアップします。

  • Discordに参加: Discordは、Reflexプロジェクトの相談や、コントリビュートについての話し合いをするための、最適な場所です。
  • GitHub Discussions: GitHub Discussionsでは、追加したい機能や、複雑で解明が必要な事柄についての議論に適している場所です。
  • GitHub Issues: Issuesはバグの報告に適している場所です。また、課題を解決したPRのサブミットにチャレンジしていただくことも、可能です。

スキルや経験に関わらず、私たちはコントリビュータを積極的に探しています。コントリビュートするために、CONTIBUTING.mdをご覧ください。

ライセンス

Reflexはオープンソースであり、Apache License 2.0に基づいてライセンス供与されます。

今日は以上です。

ありがとうございました。
よろしくお願いいたします。

16
30
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
16
30