📁 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(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은 간단하게 logout_user()
를 사용해주면 된다.
logout_user()
를 사용하면 session에 저장된 사용자에 대한 정보가 삭제된다.
@app.route('/logout', methods=['GET'])
def logout():
# flask login으로 logout >> 사용자 정보 세션 삭제
logout_user()
return redirect(url_for('index'))
@login_required
annotation을 사용하면 로그인이 필요한 페이지를 지정할 수 있다.
해당 annotation을 이용해 지정해주면 로그인을 하지 않은 사용자의 접근을 막을 수 있다.
@app.route('/private')
@login_required
def private_page():
session['page'] = 'private'
return render_template('main/private.html')
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) 이어야 한다.
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}'))
어노테이션이 아니라 데코레이터에요!