Skip to content

Latest commit

 

History

History
240 lines (165 loc) · 9.5 KB

README.md

File metadata and controls

240 lines (165 loc) · 9.5 KB
+ Pynecone을 찾고 계신가요? 이곳이 맞습니다. Pynecone은 이제 Reflex로 불립니다. +
Reflex Logo Reflex Logo

✨ 순수 Python으로 고성능 사용자 정의 웹앱을 만들어 보세요. 몇 초만에 배포 가능합니다. ✨

PyPI version versions Documentaiton Discord


⚙️ 설치

터미널을 열고 실행하세요. (Python 3.9+ 필요):

pip install reflex

🥳 첫 앱 만들기

reflex를 설치하면, reflex 명령어 라인 도구도 설치됩니다.

새 프로젝트를 생성하여 설치가 성공적인지 확인합니다. (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는 빠른 새로고침을 지원하므로 코드를 저장할 때마다 즉시 변경 사항을 볼 수 있습니다.

🫧 예시 앱

예시를 살펴보겠습니다: DALL·E를 중심으로 이미지 생성 UI를 만들어 보겠습니다. 간단하게 하기 위해 OpenAI API를 호출했지만, 이를 로컬에서 실행되는 ML 모델로 대체할 수 있습니다.

 

A frontend wrapper for DALL·E, shown in the process of generating an image.

 

이것이 완성된 코드입니다. 이 모든 것은 하나의 Python 파일에서 이루어집니다!

import reflex as rx
import openai

openai_client = openai.OpenAI()


class State(rx.State):
    """The app state."""

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

    def get_image(self):
        """Get the image from the prompt."""
        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",
                loading=State.processing
            ),
            rx.cond(
                State.complete,
                rx.image(src=State.image_url, width="20em"),
            ),
            align="center",
        ),
        width="100%",
        height="100vh",
    )

# Add state and page to the app.
app = rx.App()
app.add_page(index, title="Reflex:DALL-E")

하나씩 살펴보겠습니다.

Reflex UI

UI부터 시작해봅시다.

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

index 함수는 앱의 프론트엔드를 정의합니다.

center, vstack, input, button과 같은 다양한 컴포넌트를 사용하여 프론트엔드를 구축합니다. 컴포넌트들은 복잡한 레이아웃을 만들기 위해 서로 중첩될 수 있습니다. 그리고 키워드 인자를 사용하여 CSS의 모든 기능을 사용하여 스타일을 지정할 수 있습니다.

Reflex는 시작하기 위한 60개 이상의 기본 컴포넌트를 제공하고 있습니다. 더 많은 컴포넌트를 추가하고 있으며, 자신만의 컴포넌트를 생성하는 것도 쉽습니다.

State

Reflex는 UI를 State 함수로 표현합니다.

class State(rx.State):
    """The app state."""
    prompt = ""
    image_url = ""
    processing = False
    complete = False

state는 앱에서 변경될 수 있는 모든 변수(vars로 불림)와 이러한 변수를 변경하는 함수를 정의합니다.

여기서 state는 promptimage_url로 구성됩니다. 또한 processingcomplete라는 불리언 값이 있습니다. 이 값들은 이미지 생성 중 버튼을 비활성화할 때와, 결과 이미지를 표시할 때를 나타냅니다.

Event Handlers

def get_image(self):
    """Get the image from the prompt."""
    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

State 내에서, state vars를 변경하는 이벤트 핸들러라고 불리는 함수를 정의합니다. 이벤트 핸들러는 Reflex에서 state를 변경하는 방법입니다. 버튼을 클릭하거나 텍스트 상자에 입력하는 것과 같이 사용자 동작에 응답하여 호출될 수 있습니다. 이러한 동작을 이벤트라고 합니다.

DALL·E. 앱에는 OpenAI API에서 이미지를 가져오는 get_image 이벤트 핸들러가 있습니다. 이벤트 핸들러의 중간에 yield를 사용하면 UI가 업데이트됩니다. 그렇지 않으면 UI는 이벤트 핸들러의 끝에서 업데이트됩니다.

Routing

마지막으로, 앱을 정의합니다.

app = rx.App()

앱의 루트에서 index 컴포넌트로 페이지를 추가합니다. 또한 페이지 미리보기/브라우저 탭에 표시될 제목도 추가합니다.

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

여러 페이지를 추가하여 멀티 페이지 앱을 만들 수 있습니다.

📑 자료

📑 문서   |   🗞️ 블로그   |   📱 컴포넌트 라이브러리   |   🖼️ 갤러리   |   🛸 배포  

✅ 상태

Reflex는 2022년 12월 Pynecone이라는 이름으로 출시되었습니다.

2023년 7월 현재, 우리는 Public Beta 상태에 있습니다.

  • Public Alpha: 누구나 Reflex를 설치하고 사용할 수 있습니다. 문제가 발생할 수도 있지만 적극적으로 수정합니다.
  • 🔶 Public Beta: 비상업적 용도로 충분히 안정적입니다.
  • Public Hosting Beta: 선택적으로, Reflex에서 앱을 배포하고 호스팅할 수 있습니다!
  • Public : Reflex는 프로덕션 준비를 마쳤습니다.

Reflex는 매주 새로운 릴리즈와 기능을 제공합니다! 최신 정보를 확인하려면 ⭐ Star와 👀 Watch를 눌러 이 저장소를 확인하세요.

기여

우리는 모든 기여를 환영합니다! 아래는 Reflex 커뮤니티에 참여하는 좋은 방법입니다.

  • Discord 참여: 우리의 Discord는 Reflex 프로젝트에 대한 도움을 받고 기여하는 방법을 논의하는 최고의 장소입니다.
  • GitHub Discussions: 추가하고 싶은 기능이나 혼란스럽거나 해결이 필요한 것들에 대해 이야기하는 좋은 방법입니다.
  • GitHub Issues: 이것은 버그를 보고하는 훌륭한 방법입니다. 또한, 기존의 이슈를 해결하고 PR을 제출할 수 있습니다.

우리는 능력이나 경험에 상관없이 적극적으로 기여자를 찾고 있습니다.

License

Reflex는 오픈소스이며 Apache License 2.0로 라이선스가 부여됩니다.