Web/web dev

Flask-Login을 활용한 인증과 세션 관리

hy30nq 2024. 6. 19. 17:01
728x90

안녕하세요! 이번 글에서는 Flask-Login을 이용해 사용자 인증과 세션 관리를 구현하는 방법을 소개해드릴게요. 📝

1. Flask-Login 설정하기

먼저, Flask와 필요한 모듈들을 설치해야 해요.

from flask import Flask, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, login_required, login_user, logout_user, UserMixin, current_user

이제 Flask 애플리케이션과 데이터베이스를 설정해 볼게요.

app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:Mhg0430%40@localhost/learnf"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SECRET_KEY'] = 'mysecretkey'

db = SQLAlchemy(app)

2. Flask-Login 초기화

LoginManager를 초기화하고 Flask 애플리케이션과 연결합니다.

login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login'

3. 사용자 모델 정의하기

사용자 모델을 정의해요. UserMixin을 상속받아야 해요.

class User(UserMixin, db.Model):
  id = db.Column(db.Integer, primary_key=True)
  username = db.Column(db.String(80), unique=True, nullable=False)
  email = db.Column(db.String(120), unique=True, nullable=False)
  password = db.Column(db.String(128))

  def __repr__(self):
    return '<User {self.username}>'

with app.app_context():
  db.create_all()

4. 사용자 로더 함수 정의

로그인된 사용자를 로드하는 함수를 정의합니다.

@login_manager.user_loader
def load_user(user_id):
  return User.query.get(int(user_id))

5. 라우트 설정하기

기본 라우트를 설정하고, 로그인 상태에 따른 페이지를 정의해요.

@app.route('/')
def index():
  return 'Home Page'

@app.route('/protected')
@login_required
def protected():
  return f'Logged in as {current_user.username}'

6. 로그인 및 로그아웃 라우트

로그인 폼을 만들고 로그인 처리를 추가해요.

@app.route('/login', methods=['GET', 'POST'])
def login():
  if request.method == 'POST':
    username = request.form['username']
    password = request.form['password']
    user = User.query.filter_by(username=username).first()

    if user and user.password == password:
      login_user(user)

      return redirect(url_for('protected'))

  return '''
      <form method="POST">
        Username: <input type="text" name="username"><br>
        Password: <input type="password" name="password"><br>
        <input type="submit" value="login">
      </form>
  '''

@app.route('/logout')
@login_required
def logout():
  logout_user()
  return redirect(url_for('index'))

7. 테스트 사용자 생성

테스트 사용자를 생성할 수 있는 라우트를 추가합니다.

@app.route('/create_test_user')
def create_test_user():
  test_user = User(username='testuser', email='test@example.com', password='testpassword')
  db.session.add(test_user)
  db.session.commit()
  return "Test user created"

이렇게 해서 Flask-Login을 이용한 기본적인 사용자 인증과 세션 관리 기능을 구현했어요. 💡

세션으로 인증 구현하기

이번에는 세션을 활용한 인증 구현 방법을 소개할게요.

from flask import Flask, request, redirect, url_for, session
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, login_required, login_user, logout_user, UserMixin, current_user

app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:Mhg0430%40@localhost/learnf"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SECRET_KEY'] = 'mysecretkey'

db = SQLAlchemy(app)

login_manager =  LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login'

class User(UserMixin, db.Model):
  id = db.Column(db.Integer, primary_key=True)
  username = db.Column(db.String(80), unique=True, nullable=False)
  email = db.Column(db.String(120), unique=True, nullable=False)
  password = db.Column(db.String(128))

  def __repr__(self):
    return '<User {self.username}>'

@login_manager.user_loader
def load_user(user_id):
  return User.query.get(int(user_id))

with app.app_context():
  db.create_all()

@app.route('/')
def index():
  user_id = session.get('user_id')
  if user_id:
    user = User.query.get(user_id)
    return f'Logged in as {user.username}'
  return 'You are not logged in'

@app.route('/protected')
@login_required
def protected():
  return f"Logged in as {current_user.username}"

@app.route('/login', methods=['GET', 'POST'])
def login():
  if request.method == 'POST':
    username = request.form['username']
    password = request.form['password']
    user = User.query.filter_by(username=username).first()
    if user and user.password == password:
      login_user(user)
      session['user_id'] = user.id

      return redirect(url_for('protected'))
  return '''
    <form method="POST">
        Username: <input type="text" name="username"><br>
        Password: <input type="password" name="password"><br>
        <input type="submit" value="login">
      </form>
    '''

@app.route('/logout')
@login_required
def logout():
  logout_user()
  session.pop('user_id', None)
  return redirect(url_for('index'))

@app.route('/create_test_user')
def create_test_user():
  test_user = User(username='testuser', email='test@example.com', password='testpassword')
  db.session.add(test_user)
  db.session.commit()
  return "Test user created"

이 글이 여러분의 프로젝트에 도움이 되길 바랄게요! 궁금한 점이 있다면 언제든지 댓글로 남겨주세요. 😊

728x90