1. python flet with supabase

최종 업데이트 : 2025-02-08

복습할겸 다시한번 진행해봅니다.

    
import flet as ft

def main(page: ft.Page):
  page.add(
    ft.Text("이메일")
  )

ft.app(main)
    
  

이전처럼 기본 구문을 만들어서 실행부터 해봅니다.

    
page.add(
  ft.Text("이메일"),
  ft.Text("패스워드"),
  ft.Text("패스워드확인"),
  ft.TextButton(text="회원가입"),
  ft.TextButton(text="로그인"),
)
    
  

페이지에 사용될 기본컨트롤을 배치합니다.

    
def main(page: ft.Page):
  email = ft.TextField()
  password = ft.TextField(password=True, can_reveal_password=True)
  password_check = ft.TextField(password=True, can_reveal_password=True)

page.add(
  ft.Text("이메일"),
  email,    
  ft.Text("패스워드"),
  password,
  ft.Text("패스워드확인"),
  password_check,
  ft.TextButton(text="회원가입"),
  ft.TextButton(text="로그인"),
)
    
  

입력필드를 추가합니다.

패스워드 관련해서는 기본적으로 내용을 알수없게 password 옵션을 주고

필요시 입력값을 확인할수있도록 can_reveal_password 옵션을 추가합니다.

추가한 입력필드를 페이지에 추가합니다.

실행하여 컨트롤 배치를 확인해봅니다.

    
def main(page: ft.Page):
  def open_snackbar(message: str):
    page.snack_bar = ft.SnackBar(ft.Text(message))
    page.snack_bar.open = True
    page.update()
    
  

snackbar를 사용하기 위한 함수를 추가합니다.

작성한 코드가 정상정으로 이루어지지 않았을때

snackbar를 호출하여 시각적으로 확인합니다.

    

def main(page: ft.Page):
  def signup_request(_):
    try:
      if not email.value or not password.value or not password_check.value:
          open_snackbar("이메일, 패스워드, 패스워드확인란을 입력해주세요.")
          return
    except Exception as e:
      print({e})
      open_snackbar(f"오류 발생: {e}") 

    
  

회원가입 버튼에서 사용할 signup_request 함수를 만들어줍니다.

on_click이벤트를 이용함으로 이벤트자체인 e를 넘기나

실직적으로는 사용하지 않으니 (_)으로 사용하지 않음을 명시합니다.

try문을 이용하여 예외사항이 있을때 터미널과 snackbar에서 확인할 수 있도록 하고

입력필드들의 값이 전부 입력하도록 조건을 만듭니다.

조건을 만족하지 않으면 snackbar로 알려주고

return을 이용하여 해당 위치에서 로직이 멈추도록합니다.

    
  
models.py

from pydantic import BaseModel, EmailStr

class EmailModel(BaseModel):
    email: EmailStr


main.py

from models import EmailModel

  def main(page: ft.Page):
    def signup_request(_):
      try:
        if password.value != password_check.value:
            open_snackbar("패스워드가 일치하지 않습니다.")
            return

        if len(password.value) < 6:
            open_snackbar("패스워드는 6자리 이상이어야 합니다.")
            return
                
        try:
          emailmodel = EmailModel(email=email.value)
        except ValidationError as e:
          open_snackbar("이메일형식으로 입력해주세요.")
          return
  
    
  

그 외 필요한 조건들을 고려해서 작성해봅니다.

패스워드 일치여부를 롹인하지 않고 한번만 기입후 가입한다면

실수할경우 해당 패스워드가 틀릴확률도 높아집니다.

보안을 위한 패스워드 규칙등도 추가해야합ㅇ니다.

이메일형태의 ID를 고려하였다면 그 규칙이 잘지켜지도록 유도해야합니다.

재사용과 검증을 위해 pydantic을 이용한 models.py파일을 만들고

해당 파일에 불러와서 사용해봅니다.

유지보수 및 재사용이 용이하도록 가능한것들은 만들어서 사용합니다.

    
  
config.py

import os
from dotenv import load_dotenv
from supabase import create_client, Client

load_dotenv()

SUPABASE_URL: str = os.getenv('SUPABASE_URL')
SUPABASE_KEY: str = os.getenv('SUPABASE_KEY')
supabase: Client = create_client(SUPABASE_URL, SUPABASE_KEY)


main.py

from config import supabase

  def main(page: ft.Page):
    def signup_request(_):
      try:
        response = supabase.auth.sign_up(
            {"email": emailmodel.email, "password": password.value}
        )
        open_snackbar(f"{response.user.email} 회원가입에 성공하였습니다.")

  page.add(
    ft.TextButton(text="회원가입", on_click=signup_request),
  )
  
    
  

config피일도 만들어서 재사용할 수 있도록 해봅니다.

supabase.auth.sign_up을 이용하여 회원가입을 진행합니다.

정상적으로 진행되었다면 snackbar를 확인할 수 있습니다.

    
  
def main(page: ft.Page):
    
  def signin_request(_):     
    try:
      if not email.value or not password.value:
          open_snackbar("이메일, 패스워드를 입력해주세요.")
          return

      if len(password.value) < 6:
          open_snackbar("패스워드는 6자리 이상이어야 합니다.")
          return
              
      try:
        emailmodel = EmailModel(email=email.value)
      except ValidationError as e:
        open_snackbar("이메일형식으로 입력해주세요.")
        return

      response = supabase.auth.sign_in_with_password(
          {"email": emailmodel.email, "password": password.value}
      )
      open_snackbar(f"{response.user.email} 로그인에 성공하였습니다.")
    except Exception as e:
        print({e})
        open_snackbar(f"오류 발생: {e}") 

  page.add(
    ft.TextButton(text="로그인", on_click=signin_request),
  )
  
    
  

로그인버튼은 앞선 회원가입의 반복입니다.

supabase.auth.sign_in_with_password을 이용하기위해

필요한 조건들을 추가하고 실행해봅니다.

Related Pages

© 2024 Coding Stairs. All rights reserved.