개요
Flask-Login
은 세션을 사용한 사용자 인증을 쉽게 관리할 수 있도록 도와주는 라이브러리로 사용자 로그인 및 로그아웃 프로세스를 처리하고, 현재 로그인한 사용자의 정보에 접근 가능하게 해준다.
주요 기능
- 활성 유저의 ID를 세션에 저장 및 간편한 로그인, 로그아웃
- 로그인 여부에 따라 특정 뷰에 접근여부를 지정
Remember me
기능- 쿠키 해킹으로 부터 유저 세션 보호
- Flask-Principal과 같은 확장 인증 라이브러이와 연동
설치
> pip install flask-login
사용 방법
app.py
# app.py
from flask import Flask
from flask_login import LoginManager
from models import User
# 'routes' 모듈을 임포트하기 전에 'app'과 'login_manager' 객체를 생성해야 함
app = Flask(__name__)
app.secret_key = 'your_secret_key'
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login'
@login_manager.user_loader
def load_user(user_id):
return User.get(user_id)
# 이제 'routes' 모듈을 임포트
from routes import configure_routes
configure_routes(app)
if __name__ == "__main__":
app.run(debug=True)
> Secret Key
app.secret_key = 'your_secret_key'
Flask-Login
이 세션을 통해 인증하기 때문에 Secret Key를 설정해 줘야 한다.- 인증을 할 때 Secret Key를 통해 값을 안전하게 보호할 수 있다.
> Flask와 연동
from flask_login import LoginManager
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login'
login_manager = LoginManager()
: 핵심 클래스인LoginManager
인스턴스 생성login_manager.init_app(app)
:LoginManager
에 플라스크 객체 연결login_manager.login_view = 'login'
: 로그인 시 사용할 뷰 설정
models.py
from flask_login import UserMixin
users = {'admin': {'password': 'secret'}}
class User(UserMixin):
def __init__(self, username):
self.id = username
@staticmethod
def get(user_id):
if user_id in users:
return User(user_id)
return None
> @staticmethod
app.py
에서User
정보를 가져올 때 인스턴스를 생성하지 않고 바로 접근하기 위해서 사용# app.py @login_manager.user_loader def load_user(user_id): return User.get(user_id)
routes.py
from flask import render_template, redirect, url_for, request, flash
from flask_login import login_user, logout_user, login_required
from models import User, users
def configure_routes(app):
@app.route('/')
def index():
return render_template('index.html')
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
user = User.get(username)
if user and users[username]['password'] == password:
login_user(user)
return redirect(url_for('index'))
else:
flash('Invalid username or password')
return render_template('login.html')
@app.route('/logout')
def logout():
logout_user()
return redirect(url_for('index'))
@app.route('/protected')
@login_required
def protected():
return '<h1>Protected area</h1> <a href="/logout">Logout</a>'
> @login_required
- 로그인이 되어있지 않으면 접근하지 못하도록 하는 데코레이터
HTML 파일
- index.html
<!DOCTYPE html>
<html>
<head>
<title>Home Page</title>
</head>
<body>
<h1>Welcome to the Home Page</h1>
<a href="/login">Login</a> |
<a href="/logout">Logout</a> |
<a href="/protected">Protected Page</a>
</body>
</html>
- login.html
<!DOCTYPE html>
<html>
<head>
<title>Login</title>
</head>
<body>
<h1>Login</h1>
<form method="post">
Username: <input type="text" name="username" /><br />
Password: <input type="password" name="password" /><br />
<input type="submit" value="Login" />
</form>
</body>
</html>
위 예제는 Flask-Login
의 기본적인 사용 방법을 보여주는 예제로 실제 서비스 운영시에는 데이터베이스와 함께 사용자 인증 로직을 더 복잡하게 구성할 수 있다.
참고
- 오즈코딩스쿨 Flask 수업자료 | 김인섭 강사
- Flask-Login 0.7.0 documentation
Flask-Login 0.7.0 documentation
Toggle Light / Dark / Auto color theme Toggle table of contents sidebar
flask-login.readthedocs.io
Flask 프레임워크 기본 Step 10 - Flask-Login
1. Flask-login # 홈페이지 https://flask-login.readthedocs.io/en/latest/ # 정의 Flask...
blog.naver.com
'Python' 카테고리의 다른 글
[Python] 주석 (1) | 2024.07.03 |
---|---|
[Flask] Flask-HTTPAuth를 활용한 HTTP 기본 인증 (0) | 2024.03.26 |