프로젝트 명(폴더) : demo_board

# 파일 경로 설명 구분
1 pcconfig.py    
2 demo_board > demo_board.py    
3 demo_board > demo_state.py logincheck 함수 및 로그인 체크 시간 var 추가  
4 demo_board > demo_auth.py    
5 demo_board > demo_servers.py pc.cond 에 logincheck var로 로그인상태 체크 수정
6 demo_board > demo_helpers.py    

 

로그인 후 타임아웃시간을 지정해서 사용자가 일정시간동안 액션이 없다면 로그아웃시키는 기능을 추가합니다

별도의 세션을 체크하는 방법을 찾지 못해서 State에 login check var를 추가하고 로그인할때, 매뉴클릭시 각 화면의 권한 체크하는 pc.cond 로 login check var를 호출하도록 구현하도록 하겠습니다.

 

demo_state.py


날짜 변환 로컬 함수를 먼저 정의합니다.

from datetime import date, datetime, timezone, timedelta

# logincheck에서 사용할 함수 현재 시간을 리턴
def get_ymd_hms():
	# 클라우드 서버가 싱가폴 데이터 센터에 있기때문에 UTC=8로 한국시간과 맞춘다.
    servertime = timezone(timedelta(hours=8)) 
    now = datetime.now(servertime) 
    now_ymd = now.strftime('%Y%m%d')
    now_ymd_hms = now.strftime('%Y-%m-%d %H:%M:%S')
    #print("now_ymd_hms : {}".format(now_ymd_hms))
    
    return now_ymd_hms

# 문자열의 시간을 시간타입으로 변환
def get_strptime(ymd_hms):
    datetime_format = '%Y-%m-%d %H:%M:%S'

    datetime_ymd_hms = datetime.strptime(ymd_hms, datetime_format)
    
    return datetime_ymd_hms

 

logincheck var 추가

class State(pc.State):
    """The base state for the app."""
    
    username: str
    logged_in: bool = False # 로그인 상태 True, False
    authrole: str
    logged_ymd_hms:str #로그인 및 마지막 액션 시간을 저장

    @pc.var
    def logincheck(self) -> bool:
        """Logged in check a user."""
        
        # 현재 시간을 '%Y-%m-%d %H:%M:%S' 포켓으로 가져오기
        now_ymd_hms = get_ymd_hms()
        
        # 현재 로그인 상태이면
        if self.logged_in:
            
            # 로그인 상태이고, 로그인 시간이 기록되어 있으면
            if len(self.logged_ymd_hms) > 0:

				# 이전 로그인 또는 액션의 시간을 조회
                before_time = get_strptime(self.logged_ymd_hms)
                now_time = get_strptime(now_ymd_hms)

				# 현재 시간과 이전 시간의 차이를 계산
                cul_time = now_time - before_time
                
                # 차이가 지정된 시간보다 크다면 로그인 상태 False로
                if cul_time.seconds > 3600: #600 : 10 Minutes
                    self.logged_in = False
                    self.logged_ymd_hms = ""
                    return self.logged_in

            # 지정된 시간안에 있으면, 현재 시간을 logged_ymd_hms에 저장
            self.logged_ymd_hms = now_ymd_hms
        
        return self.logged_in

 

demo_servers.py


demo_servers.py 의 servers 함수에서 pc.cond에서 로그인 상태 체크를 logged_in 에서 logincheck var 로 변경한다.

 

def servers():
    """The Servers page."""
    return pc.center(
        pc.vstack(
            navbar(State, ServerState.app_name),
            pc.cond(
                State.logincheck,
                pc.box(
                    pc.vstack(
                        searchbar(ServerState),
                        progress_modal(ServerState),
                        render_table(ServerState),
                        #render_datatable(ServerState),
                        footer_bottom(),
                    ),
                    width="100%",
                    border_width="0px",
                ),
                pc.link(
                    pc.button("먼저 로그인 하세요"),
                    href="/",
                    color="rgb(107,99,246)",
                    button=True,
                )
            ),
            padding_top="10em",
            width="100%",
        ),
    )

 

 

추가로 로그인후 액션없이 오래 떠있던 웹페이지에서 검색 버튼 클릭시 log in 상태를 체크할수 있도록 방어코드를 추가합니다.

(로그아웃 상태로 CircularProgress가 작동되지 않도록)

 

demo_servers.py

class ServerState(State):
    """The state for the Server page."""
    print("──────────────────── [ ServerState(State) ] ─────────────────────")
    app_name: str = "Server & Apps"
    
    
    생략 ...
    
    # 1. Progress 를 보여줄지 말지 결정할 Toggle 이벤트
    prog_show: bool = False
    def prog_show_change(self):
        """Toggle the Update Progress modal."""
        
        # 우선 로그인 상태를 체크해서 CircularProgress 모달이 뜨지 않도록 합니다.
        if self.logged_in == False:
            return
            
        self.prog_show = not (self.prog_show)
        
    생략 ...
        
    def get_data_list(self):
        #print("\n[ServerState] get_data_list")
        pd_result_list: List[Dict] = get_server_data(self.select1_id, self.select2_id)
        self.table_columns = list(pd_result_list.columns)
        self.table_data = pd_result_list.values.tolist()
        #print("[ServerState] get_data_list pd_result_list len : {}\n".format(len(pd_result_list)))

        # 2. 기존 "검색" 버튼 클릭시 데이터 조회하는 Class 함수에 
        # Progress 컨포넌트 상태 변경 이벤트를 호출
        return self.prog_show_change()

 

아래 그림처럼 login 체크 시간을 보이도록 설정할수도 있습니다. (Optional demo_helpers.py 수정)

+ Recent posts