이번 실습은 로그인, 로그아웃과 관련된 기능을 작성하려고 합니다.
로그인은 데이터베이스의 정보와 입력받은 정보를 비교한 후, 일치한다면 session에 사용자를 식별할 수 있는 정보를 넣어 주는 과정을 말합니다.
로그아웃은 저장되어있던 session 정보를 없애주는 기능을 말합니다.
session을 사용해서 로그인/로그아웃을 구현하세요.
추가 설정API를 설정해 주는 부분에는 여러 가지 설정을 추가할 수 있습니다. 모든 요청 전에 실행하는 함수인 **before_app_request**를 활용해서 요청마다 로그인된 사용자가 있는지 파악하도록 하겠습니다.
%%
requirements.txt
flask_sqlalchemy
pymysql
@board.before_app_request
def load_logged_in_user():
user_id = session.get('login')
if user_id is None:
g.user = None
else:
g.user = db.session.query(User).filter(User.id == user_id).first()
api.py 파일에서, /login url을 가진 login() 함수를 작성하세요. GET과 POST 모두 사용할 수 있는 함수로 작성하세요.
render_template*를 사용해서 **login.html*을 화면에 나타내고, POST라면 데이터를 저장하는 기능을 작성할 수 있게 if 문으로 분리하세요.*/login*으로 들어오는 요청이 POST 일 경우 **user_id*와 **user_pw*를 화면에서 받아오는 코드를 작성하세요.
user_id = request.form['user_id']
user_pw = request.form['user_pw']
사용자 id(user_id)를 기준으로 데이터베이스에서 사용자를 검색한 후 하나의 모델을 user 변수에 저장하세요.
user = User.query.filter(User.user_id == user_id).first()
3번에서 가져온 user 변수가 **None*이 아니라면 bcrypt 모듈을 사용해서 데이터베이스 내의 암호화 된 값과 입력받은 현재의 값이 일치하는지 검사하는 기능을 작성하세요.
bcrypt 모듈의 기능은 아래와 같이 사용하면 됩니다.
# 만약 데이터베이스의 user.user_pw와 입력받은 값인 user_pw의 값이 일치하면 'True' 값을 반환합니다
if bcrypt.check_password_hash(user.user_pw, user_pw):
return true
비밀번호가 같다면, 로그인 처리를 위한 session을 설정 하세요. **session['login']*값에 **user.id*를 저장하고 jsonify({"result":"success"}) 값을 반환하세요.
만약 비밀번호가 같지 않다면 jsonify({"result":"fail"}) 값을 반환하세요.
before_app_request 함수를 응용하여 모든 request를 하기 전에 실행되는 함수에서 로그인한 사용자를 판단하는 기능을 작성하도록 하겠습니다. 아래의 코드를 api.py 상단에 붙여넣으세요.
@board.before_app_request
def load_logged_in_user():
user_id = session.get('login')
if user_id is None:
g.user = None
else:
g.user = db.session.query(User).filter(User.id == user_id).first()
로그아웃은 session을 **None*으로 설정 해 주는 기능입니다. /logout url을 선언하고 session을 **None*으로 설정하는 **logout()*함수를 작성하세요. 반환값은 redirect('/') 으로 설정하세요.
로그인을 위한 화면에서 user_id, **user_pw*를 전달하기 위해 **login.html*을 수정하세요. **login()*함수를 아래의 조건에 맞게 작성하세요
user_id*와 **user_pw*를 선언하고 jQuery를 사용해서 입력된 정보를 가져오세요./login 주소로 post 방식으로 전송 한 후 데이터를 전송하세요. 데이터는 **user_id*와 **user_pw*를 키값으로 가집니다.result 키값에 들어있는 값이 **success*라면, **alert("로그인 성공")*을 출력하고 window.location.href='/' 를 사용해서 화면을 이동하세요.result*키 값에 들어있는 값이 **success*가 아니라면 **alert("로그인 실패!")*를 출력하고 **window.location.reload()*를 사용해서 새로고침을 하세요