이번 실습은 로그인, 로그아웃과 관련된 기능을 작성하려고 합니다.
로그인은 데이터베이스의 정보와 입력받은 정보를 비교한 후, 일치한다면 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()
*를 사용해서 새로고침을 하세요