Python

[Flask] Flask-Login

뉴비션 2024. 3. 27. 18:27

개요

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-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