파이썬(Python)/Flask

[Python] 세션(Session)이란? flask에서 구현해보기(jinja2사용)

끄적끄적아무거나 2021. 11. 24. 13:40
반응형

 

목차

     

     

     

     

     

     

    세션(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출력

     

     

    결과>>

    반응형