프로젝트 명(폴더) : 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 수정)
'python > pynecone' 카테고리의 다른 글
9. pynecon Demo 조회시 CircularProgress 추가 (0) | 2023.03.17 |
---|---|
8. pynecon Demo 검색 on_click시 다중 이벤트로 Progress 보여주기 (0) | 2023.02.28 |
7.pynecone Demo 다중 Select 기능 추가 (0) | 2023.02.18 |
6.pynecone Demo List[Dict] typing table, DataTable 추가 (0) | 2023.02.18 |
5.pynecone Demo Navigation에 Menu 추가 (0) | 2023.02.18 |