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