개발하면서 프로그램을 계속 껐다 켰다 반복하다보니, 매번 로그인하는게 너~~~무 귀찮다.
그래서 id&pw 저장하는 기능을 만들고 다음 스텝으로 넘어가려고 한다.
json 형태로 파일을 떨어뜨릴거라, 계정이 pc에 저장되는 아주 위험한 작업이다..!
공용 컴퓨터에서 할 경우 개인계정이 노출될 수 있음을 주의하자!
나중에는 실행파일을 만들어서 배포할 예정이므로, db가 생성되는 경로를 다르게 만들어야 한다.
def get_db_path():
try:
# PyInstaller에 의해 임시폴더에서 실행될 경우 임시폴더로 접근하는 함수
# 한 단계 상위에 db를 생성해야 삭제되지 않음
return os.path.join(os.path.join(sys._MEIPASS, os.pardir), 'train_db.json')
except Exception:
return os.path.join(os.path.abspath("."), 'train_db.json')
try 구문 안의 내용이 실행파일을 위한 코드이고, Exception 안의 내용은 .py 파일로 실행했을 때를 위한 코드이다.
exe 파일로 실행하면, 임시 경로에 파일이 풀어져서 실행되는데 그 경로가 sys._MEIPASS 이다.
파일을 실행할 때마다 sys._MEIPASS 폴더는 사라지므로, 한 단계 상위 폴더에 db를 만들어 주기 위해서 위와 같이 코드를 작성했다.
db를 불러오는 함수를 만들어보자.
def load_db():
try:
with open(get_db_path(), 'r') as file:
data = json.load(file)
return data
except: # 파일이 없거나, dict 형태로 변환에 실패했을 경우
return dict()
db 파일이 없거나, 손상되어 dict로 변환이 불가능한 경우를 예방하기 위해, 예외처리를 해준다.
db를 저장하는 함수를 간단하게 만들자. 여기서 data는 dictionary 타입이다.
def save_db(data):
with open(get_db_path(), 'w', encoding='utf-8') as file:
json.dump(data, file, indent="\t")
이렇게 완성된 파일은 아래와 같다
util.py
import datetime
import json
import os
import sys
def get_nowtime():
return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
def get_db_path():
try:
# PyInstaller에 의해 임시폴더에서 실행될 경우 임시폴더로 접근하는 함수
# 한 단계 상위에 db를 생성해야 삭제되지 않음
return os.path.join(os.path.join(sys._MEIPASS, os.pardir), 'train_db.json')
except Exception:
return os.path.join(os.path.abspath("."), 'train_db.json')
def save_db(data):
with open(get_db_path(), 'w', encoding='utf-8') as file:
json.dump(data, file, indent="\t")
def load_db():
try:
with open(get_db_path(), 'r') as file:
data = json.load(file)
return data
except: # 파일이 없거나, dict 형태로 변환에 실패했을 경우
return dict()
로그인 정보를 저장할지 물어보는 checkBox을 하나 만들어주고,
db를 UiMainClass에서 불러오자.
class UiMainClass(QDialog):
def __init__(self):
self.srt = SRT(self.error_callback, self.srt_try_callback)
self.srt_stations = self.srt.get_stations()
self.srt_thread = None
self.radiobuttons = []
self.schedules = []
self.reservation_list = []
self.reservation_idx = 0
self.db = load_db()
db에서 불러온 정보를 Init_ui 에서 업데이트 해주자!
def init_ui(self):
self.main_ui.label_version.setText(version)
self.main_ui.label_srt_logged_in.hide()
### SRT ###
# db에 데이터가 있는 경우 불러오기
if 'srt_login_type' in self.db.keys():
if self.db['srt_login_type'] == 0 or self.db['srt_login_type'] == 1 or self.db['srt_login_type'] == 2:
self.main_ui.comboBox_srt_login_type.setCurrentIndex(self.db['srt_login_type'])
if 'srt_id' in self.db.keys():
self.main_ui.lineEdit_srt_id.setText(self.db['srt_id'])
if 'srt_pwd' in self.db.keys():
self.main_ui.lineEdit_srt_pwd.setText(self.db['srt_pwd'])
if 'save_login_info' in self.db.keys() and self.db['save_login_info']:
self.main_ui.checkBox_srt_save_login.setChecked(True)
db에 저장은 로그인 버튼을 클릭할 때 진행하므로, pushButton_srt_login_clicked 에서 db에 저장한다.
로그인이 성공했을 때만, db를 바꾼다.
def pushButton_srt_login_clicked(self):
login_type = self.main_ui.comboBox_srt_login_type.currentIndex()
srt_id = self.main_ui.lineEdit_srt_id.text()
srt_pwd = self.main_ui.lineEdit_srt_pwd.text()
if self.srt.login(str(login_type + 1), srt_id, srt_pwd):
# 로그인 성공
self.main_ui.groupBox_login.hide()
self.main_ui.label_srt_logged_in.setText(f'로그인 계정 : {srt_id}')
self.main_ui.label_srt_logged_in.show()
if self.main_ui.checkBox_srt_save_login.isChecked():
# 로그인 정보 저장
self.db['srt_login_type'] = login_type
self.db['srt_id'] = srt_id
self.db['srt_pwd'] = srt_pwd
self.db['save_login_info'] = True
else:
# 로그인 정보 삭제
self.db['srt_login_type'] = 0
self.db['srt_id'] = ''
self.db['srt_pwd'] = ''
self.db['save_login_info'] = False
save_db(self.db)
실행해보면 로그인 정보가 잘 저장되고 불러와진다..!
[참고 사이트]
'프로젝트 > SRT&KTX 매진표 예매' 카테고리의 다른 글
SRT&KTX 기차표 매크로 예매 - (8) KTX 로그인 (0) | 2024.01.15 |
---|---|
SRT&KTX 기차표 매크로 예매 - (7) 실행파일 만들기 (PyInstaller) (0) | 2024.01.12 |
SRT&KTX 기차표 매크로 예매 - (5) UI 만들기 (PyQt5) (0) | 2024.01.12 |
SRT&KTX 기차표 매크로 예매 - (4) SRT 승차권 예매 (1) | 2024.01.09 |
SRT&KTX 기차표 매크로 예매 - (3) SRT 승차권 조회 (1) | 2024.01.09 |