TOP
class="layout-aside-left paging-number">
본문 바로가기
[파이썬 Projects]/<파이썬 웹개발>

[파이썬] 플라스크(Flask) - 플라스크 프로젝트 - 메모앱(2)

by 기록자_Recordian 2024. 7. 25.
728x90
반응형
시작에 앞서
해당 내용은 <가장 빠른 풀스택을 위한 Flask & FastAPI>, Dave Lee 지음. BJ Public 출판.
내용을 토대로 작성되었습니다. 보다 자세한 사항은 해당 교재를 참고하시기 바랍니다.

이전 내용(메모앱 1단계 - 3단계)
 

[파이썬] 플라스크(Flask) - 플라스크 프로젝트 - 메모앱(1)

시작에 앞서해당 내용은 , Dave Lee 지음. BJ Public 출판.내용을 토대로 작성되었습니다. 보다 자세한 사항은 해당 교재를 참고하시기 바랍니다.메모앱 만들기 - 1단계: 애플리케이션 생성 플라스크

puppy-foot-it.tistory.com


4단계: 사용자 인증

 

◆ Flask-Login을 활용한 사용자 인증 구현

 

이전 내용에서 작성한 코드에 사용자 인증 (Flask-Login) 확장을 활용하여 로그인, 로그아웃, 사용자 세션 관리를 수행한다.

 

1. Flask-Login 및 Werkzeug(밸저크) 설치

밸저크는 비밀번호를 해시하기 위해 사용된다.

비밀번호 해싱“은 보안을 강화하기 위해 사용되는 기술 중 하나로, 사용자의 비밀번호를 안전하게 저장하는 방법다. 기본 아이디어는 일방향 함수를 사용하여 비밀번호를 변환하고, 이 변환된 값(해시)을 저장하는 것다.

(출처:https://hangbok-archive.com/)

pip install Flask-Login==0.6.3

Flask-Login은 이전에 이미 설치하였으므로 생략.

 

pip install Werkzeug==3.0.1

 

2. 세션 및 쿠키 활용을 위해 SECRET_KEY 추가

'SQLALCHEMY_DATABASE_URI' 밑에 추가

# SQLAlchemy의 수정 추적 기능 비활성화 (성능상의 이유로 권장)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 세션 및 쿠키에 대한 보안 향상을 위해 필요한 비밀 키 설정
app.config['SECRET_KEY'] = 'mysecretkey'

 

3. app.py 파일에 Flask-Login 관련 설정 추가

from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user

# LoginManager 인스턴스 생성
login_manager = LoginManager() # Flask 애플리케이션과 LoginManager 인스턴스 연결
login_manager.init_app(app) # 애플리케이션에 LoginManager 적용
login_manager.login_view = 'login' # 로그인 페이지의 뷰 함수 이름 설정

 

4. 사용자 모델을 정의하고, 데이터베이스 스키마에 반영

from werkzeug.security import generate_password_hash, check_password_hash

# 데이터베이스 모델 정의
class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True) # 사용자 id 기본키로 설정
    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), nullable=False) # 사용자 비밀번호, 필수 입력
    
    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)

 

5. Flask-Login이 현재 로그인한 사용자를 로드할 수 있도록 사용자 로딩 함수 정의 (데코레이터 적용)

# 사용자 ID로 사용자를 로드하는 콜백 함수 정의(사용자 로드 함수에 데코레이터 적용)
@login_manager.user_loader
def load_user(user_id):
    # 주어진 user_id로 사용자 조회 후 반환
    return User.query.get(int(user_id))

 

6. 회원가입 기능 추가

사용자가 시스템에 등록할 수 있게 된다.

# 회원 가입 기능 추가
@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')

 

7. 로그인 및 로그아웃을 처리하기 위한 라우트 추가

# 로그인 뷰 정의
@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

 

▶ 이렇게 사용자 인증 기능을 통합하면, 프로젝트는 로그인 및 로그아웃 기능을 제공하며 사용자별 메모 관리가 가능해진다. 사용자 인증 기능은 기존의 CRUD 기능과 함께 웹 애플리케이션의 보안성을 강화하고, 사용자 경험을 향상시킨다.


다음 내용

 

[파이썬] 플라스크(Flask) - 플라스크 프로젝트 - 메모앱(3)

시작에 앞서해당 내용은 , Dave Lee 지음. BJ Public 출판.내용을 토대로 작성되었습니다. 보다 자세한 사항은 해당 교재를 참고하시기 바랍니다.이전 내용(메모앱 1단계 - 3단계) [파이썬] 플라스크(Fl

puppy-foot-it.tistory.com

 

728x90
반응형