목차
세션(Session)이란?
앞서 포스트에서 쿠키(Cookie)에 대해 알아 보았습니다. 쿠키처럼 세션(Session)도 고객의 데이터이고 해당 데이터를 클라인트(Client) 브라우져(Browser)에 저장 해 놓습니다. 세션에서 보관하는 데이터는 flask에 의해 암호화 됩니다.
예를 들어 로그인한 상태에서 볼수 있는 페이지와 로그인이 되지 않은 상태에서 보이는 페이지 구분을 주고 싶을 때 세션에서 기록해서 Jinja2를 사용해서 해당 유져가 로그인 된 사용자인지 구분하여 다른 페이지를 보여 주는 것이 가능 합니다.
Flask에서 세션(Session)을 사용하기 위해 필요한 선행 작업
app.secret_key = "My_Key"
앞서 세션이란 flask에서 암호화하여 정보를 client 브라우져에 보관한다고 하였습니다. 암호화를 위해 특정 문자열을 secret_key에 저장하여야 합니다. 여기에 들어갈 값은 임의의 값으로 정할 수 있습니다. 일반적으로 random 함수를 사용해서 변경하여 사용 합니다.
세션에 값을 입력하는 방법과 값을 제거(삭제)하는 방법은 아래와 같습니다.
session['키값'] = 넣고자 하는 값
session.pop("키값", None)
Flask에서 세션(Session)을 사용하기 예제
이번 예제의 html은 아래와 같이 2개로 구성 됩니다.
- login.html
- main.html
main 페이지에 접속했을때 로그인의 id 정보가 없을 경우 login 페이지로 이동 시켜 줍니다. login 페이지에서 id와 pw를 입력 하면 form으로 전송하고 flask는 id를 session에 저장합니다.
그리고 다시 main 페이지로 이동하는 데 id 정보가 있으면 main 페이지에 id 정보를 출력 합니다.
logout 페이지에 접속하면 자동으로 id 값을 session에 빼줍니다.
파이썬 코드>>
from flask import Flask, session, request, render_template
app = Flask(__name__)
app.secret_key = "My_Key"
@app.route('/main')
def main():
if 'id' in session:
id = session['id']
print(id)
return render_template("main.html")
else :
return render_template("login.html")
@app.route('/login', methods = ['GET', 'POST'])
def login():
if request.method == 'POST':
session['id'] = request.form['id']
return render_template("main.html")
else:
return render_template("login.html")
@app.route('/logout')
def logout():
session.pop('id', None)
return render_template("main.html")
if __name__ == '__main__':
app.run(debug = True, port=9999)
3번 라인: session을 위한 비밀번호 설정
7번 라인: id키값으로 세션에 있을 경우 main.html로 이동
17번 라인: form으로 전달 받은 id 값을 session에 저장
24번 라인: session의 id 값 제거
login.html>>
<!DOCTYPE html>
<html lang="en">
<head>
<title>scribblinganything.tistory.com</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.2/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.2/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<div class="container-sm">
<form action = "http://localhost:9999/login" method = "post">
<input type="text" class="form-control " id="id" placeholder="id" name="id">
<label for="아이디">아이디</label>
<input type="text" class="form-control" id="pw" placeholder="pw" name="pw">
<label for="pw">비밀번호</label>
<button type="submit" class="btn btn-primary" style="float:right;" id="login">로그인</button>
</form>
</div>
</body>
</html>
id와 pw 입력하는 form이 있는 html 파일
main.html>>
<!DOCTYPE html>
<html lang="en">
<head>
<title>scribblinganything.tistory.com</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.2/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.2/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
{% if session["id"] %}
<p>Your ID is {{session["id"]}}</p>
{% endif %}
</body>
</html>
11번 라인 : jinja2 의 if 문을 사용하여 session에 id 값이 있는 지 확인
12번 라인 : 있을 경우 id출력
결과>>
'파이썬(Python) > Flask' 카테고리의 다른 글
[Python] Flask 메세지창 만들기(로그인페이지 예제) (Alert, Flashing, Popup) (0) | 2021.11.26 |
---|---|
[Python] Flask Redirect, Abort 함수 사용방법, HTTP 상태코드 보내기 예제(Status Code) (0) | 2021.11.25 |
[Python] Flask, Jinja2 form데이터 출력하기(for문, bootstrap 사용) (0) | 2021.11.20 |
[Python] Flask와 Jinja2 사용하여 데이터 주고 받기 (0) | 2021.11.19 |
[Python] flask form 값 받기 (GET, POST) (0) | 2021.11.17 |