저번 시간 까지 구현해보았던 Flask 메모앱 애플리케이션을 한단계 더 진화시켜보고자 합니다.
뭐냐하면, 두구두구두구... 바로 사용자 인증 기능 구현에 관한 내용입니다.
즉 "온라인 메모장" 프로젝트에 사용자 인증 기능을 구현하는 것입니다.
이때 사용자 인증 Flask-Login 확장을 활용하여 구현하며, 이를 통해 로그인, 로그아웃, 그리고 사용자 세션 관리를 수행해 보도록 해보아요
1. Flask-Login을 활용하여 사용자 인증 구현
Flask-Login 과 Werkzeug(벨저크 라 읽는 것 같습니다.)를 설치합니다. Werkzeug는 비밀번호를 해시(암호화)하기 위해 사용합니다.
그래서 아래와 같이 pip를 이용하여 설치를 진행합니다.
pip install Flask-Login
Flask-Login만 설치해도 Werkzeug가 자동 설치 됩니다.
다음은 세션 및 쿠키 활용을 위해 app.py 파일에서 SECRET_KEY를 추가해 봅니다.
'mysecretkey' 부분을 비밀번호 처럼 다른 것으로 바꾸시면 됩니다.
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:password@localhost/my_memo_app'\
# SQLAlchemy의 수정 추적 기능을 성능 최적화를 위해 비활성화 합니다.
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 세션 및 쿠키에 대한 보안 향상을 위해 필요한 비밀키를 설정합니다.
app.config['SECRET_KEY'] = 'mysecretkey'
더불어 app.py 파일에 아래와 같이 Flask-Login 관련 설정을 추가해줍니다.
# Flask-Login 관련 설정
from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login' # 로그인 페이지의 뷰 함수 이름 정의
마찬가지로 app.py에 다음과 같이 사용자 모델을 정의하고, 데이터베이스 스키마에 반영합니다.
# 사용자 모델 정의, 데이터베이스 스키마 반영
from werkzeug.security import generate_password_hash, check_password_hash
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(100), unique=True, nullable=False)
email = db.Column(db.String(100), unique=True, nullable=False)
password_hash = db.Column(db.String(512))
def set_password(self, password):
self.password_hash = generate_password_hash(password)
def check_password(self, password):
return check_password_hash(self.password_hash, password)
그리고, Flask-Login이 현재 로그인한 사용자를 로드할 수 있도록 사용자 로딩 함수를 정의해 줍니다.
# Flask-Login이 현제 로그인한 사용자를 로드할 수 있도록 사용자 로딩 함수를 정의함
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
이제는 회원가입 기능을 추가해 봅니다. 이 기능을 통해 새로운 사용자가 시스템에 가입등록을 할 수 있습니다.
# 회원가입 기능 추가
@app.route('/signup', methods=['GET', 'POST'])
def signup():
if request.method == 'POST':
username = request.form['username']
email = request.form['email']
password = request.form['password']
user = User(username=username, email=email)
user.set_password(password)
db.session.add(user)
db.session.commit()
return jsonify({'message': 'Account Created successfully'}), 201
return render_template('signup.html')
마지막으로 로그인 및 로그아웃 처리를 위한 라우트를 추가합니다.
# 로그인 및 로그아웃 처리를 위한 라우트 추가
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
user = User.query.filter_by(username=request.form['username']).first()
if user and user.check_password(request.form['password']):
login_user(user)
return jsonify({'message': 'Logged in successfully'}), 200
return abort(401, description="Invalid credentials")
return render_template('login.html')
@app.route('/logout')
@login_required
def logout():
logout_user()
return jsonify({'message': 'Logged out successfully'}), 200
참고로, template 폴더 안에서 랜더링할 signup.html 과 login.html 파일을 작성하겠습니다.
첫째로 signup.html입니다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>메모앱 회원가입</title>
</head>
<body>
<form method="post">
이름 : <input type="text" name="username"><br>
E-mail : <input type="text" name="email"><br>
암호: <input type="password" name="password"><br>
<input type="submit" value="회원가입">
</form>
</body>
</html>
두번째로 login.html 파일입니다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>메모앱 로그인</title>
</head>
<body>
<form method="post">
이름 : <input type="text" name="username"><br>
암호: <input type="password" name="password"><br>
<input type="submit" value="로그인">
</form>
</body>
</html>
자, 그럼 하나씩 테스트 해봅니다.
1. 회원가입 테스트
http://127.0.0.1:5000/signup
회원가입 버튼을 누르면
성공 했다는 메시지가 나옵니다. MySQL Command에서도 확인 해볼께요
비밀번호가 해시 암호화가 되어 잘 들어간 것을 확인할 수 있습니다.
2. 로그인 테스트
이어 로그인 테스트를 진행합니다. http://127.0.0.1:5000/login 으로 진행 합니다.
로그인 버튼을 누릅니다.
로그인도 성공하였습니다.
3. 로그아웃 테스트
로그인 상태이기 때문에 바로 웹브라우저 창을 닫지 않은 상태에서 URL을 http://127.0.0.1:5000/logout으로 바꿔서 진행 합니다.
네 로그아웃도 아주 잘되는 군요
오늘은 여기까지 하겠습니다.
다음시간에 또 이어서 진행하겠습니다. 감사합니다.^^
'IT' 카테고리의 다른 글
Fedora 리눅스 워크스테이션 버전 설치 및 nVidia 드라이버 설치방법(Fedora KDE Plasma의 문제점 발견) (0) | 2024.11.22 |
---|---|
Flask - 애플리케이션(메모앱) 만들어보기 #5 (0) | 2024.11.19 |
Flask - 애플리케이션(메모앱) 만들어보기 #3 (1) | 2024.11.17 |
Flask - 애플리케이션(메모앱) 만들어보기 #2 (3) | 2024.11.15 |
Flask - 애플리케이션(메모앱) 만들어보기 #1 (2) | 2024.11.14 |