[Flask] Flask-Login을 이용한 login 기능 구현하기

강버섯·2022년 2월 21일
1

FLASK🧪

목록 보기
5/7

👉 Flask Login?

📁 Flask-Login docs
flask에서 로그인 기능을 구현하도록 도와주는 라이브러리이다.
Flask-Login을 이용하여 로그인을 하면, flask session에 로그인한 사용자의 정보를 저장한다.

👉 사용하기

1. 설치

사용하기 위해서 dependency를 추가해준다.

$> poetry add flask-login

2. 적용하기

설치가 완료 되었다면, flask-login instance를 생성하고 Flask instance를 이용해 flask에 적용시켜준다.

from flask_login import LoginManager
from flask import Flask

app = Flask(__name__)

login_manager = LoginManager()
login_manager.init_app(app)

3. 사용자 객체 생성하기

login할 사용자의 객체를 생성한다.
사용자 정보로 저장하고 싶은 값을 작성해주면 되며, flask-login에서는 UserMixin이라는 사용자 클래스 객체를 제공해주기 때문에, 해당 클래스를 상속 받아 구현하면 더 간단히 구현할 수 있다.

from flask-login import UserMixin

class User(UserMixin):
    def __init__(self, id, email, name, password):
        self.id = id
        self.email = email
        self.name = name
        self.password = password

    def get_id(self):
        return self.id

    def __repr__(self):
        return f"USER: {self.id} = {self.name}"

4. 사용하기

✏️ login_user

login_user(User 객체)를 이용하여 사용자의 login 정보를 관리할 수 있다.
login_user는 로그인한 사용자의 정보를 session에 저장해주는 역할을 수행한다.

from flask import request, url_for, redirect
from flask-login import login_user

@app.route('/login', methods = ['GET', 'POST'])
def login():

    if request.method == 'GET':
        next = request.args.get('next', '') # login 후 이동할 페이지 지정

    else:
        # form 방식으로 받아올 때에는 form에, json 방식으로 받아올 때에는 json에 원하는 정보가 담겨있음
        email = request.form.get('email')
        password = request.form.get('password')
        next = request.form.get('next')
        safe_next_redirect = url_for('index')

        if next:
            safe_next_redirect = next

        user = user_repo.get_by_email(email)
        if user.password == password:
        	# login 한 사용자의 정보를 session에 저장해줌
            login_user(user)
            return redirect(safe_next_redirect)

    return render_template('auth/login.html', next=next)	

session에 저장된 사용자에 대한 정보는 current_user라는 값을 통해서 확인해볼 수 있다.

✏️ logout_user

logout은 간단하게 logout_user()를 사용해주면 된다.
logout_user()를 사용하면 session에 저장된 사용자에 대한 정보가 삭제된다.

@app.route('/logout', methods=['GET'])
def logout():
    # flask login으로 logout >> 사용자 정보 세션 삭제
    logout_user()
    return redirect(url_for('index'))

✏️ login_required

@login_required annotation을 사용하면 로그인이 필요한 페이지를 지정할 수 있다.
해당 annotation을 이용해 지정해주면 로그인을 하지 않은 사용자의 접근을 막을 수 있다.

@app.route('/private')
@login_required
def private_page():
    session['page'] = 'private'
    return render_template('main/private.html')

✏️ user_loader

flask login에서는 기본적으로 login을 수행하기 전에 사용자가 로그인이 되었는지 판단 가능하다.
로그인이 되어있는지 판단하는 기능을 실행하기 전에 사용자 정보를 조회하는데, 이때@login_manager.user_loader annotation이 붙여진 부분이 수행된다.

@login_manager.user_loader
def load_user(user_id):
	return user_repo.get(user_id)

사용자의 정보를 조회해주는 역할을 하기 때문에 load_user()의 return 값은 생성한 사용자 객체(User) 이어야 한다.

✏️ unauthorized_handler

login이 필요한 페이지에 접근 시 수행될 동작을 정의할 수 있다.
login_required로 작성된 페이지의 접근이 시도될 경우 login이 되어있지 않다면, @login_manager.unauthorized_handler annotation이 달린 함수에 적혀진 내용이 수행된다.

@login_manager.unauthorized_handler
def unauthorized_callback():
    # print(dir(request))
    # login이 필요한 page에 접근 시 login page로 이동을 시켜줌
    query_string = urlencode(request.args)

    return redirect(url_for('auth.login', next=f'{request.path}?{query_string}'))
profile
무럭무럭 버섯농장

1개의 댓글

comment-user-thumbnail
2023년 7월 19일

어노테이션이 아니라 데코레이터에요!

답글 달기