파이썬(Python)/Flask

[Python] Flask 메세지창 만들기(로그인페이지 예제) (Alert, Flashing, Popup)

끄적끄적아무거나 2021. 11. 26. 09:13
반응형

 

목차

     

     

     

     

     

     

    Flask 메세지창 함수 사용법 (Message, Popup, Flash, Alert)

     

     

    어떤 사이트를 들어갈 때 로그인이 안되거나 할때 팝업창에서 "로그인이 필요합니다." 라고 뜨면서 로그인페이지로 이동하는 경험을 대부분 해보았을 것으로 생각됩니다.

     

    이처럼 메세지창을 flask의 flash 함수와 jinja2로 구현할 수 있습니다. 

     

    flash(message, category)

     

    flash의 Syntax는 위와 같습니다.

     

    message 항목에 원하는 메세지를 입력 합니다. 

    Category은 Option 항목으로 아래와 같은 타입들이 있습니다.

     

    • error
    • info
    • wanring

     

    차이는 메세지 창의 형태가 경고냐 에러냐에 따라 아이콘 모양 등이 변형 됩니다. 

     

    {% with messages = get_flashed_messages() %}
        {% if messages %}
            <script>
                alert("{{messages[-1]}}")
            </script>
        {% endif %}
    {% endwith %}

     

    위는 jinja2와 javascript를 같이 사용한 기본 형태로 HTML 문서 위에 저는 일반적으로 배치 합니다.

    messages[-1]은 마지막으로 flash에 들어온 값을 출력 해줍니다.

    반응형

     

     

     

    Flask 메세지창 함수 사용한 예제 (Message, Popup, Flash, Alert)

     

     

    이번 예제는 기능은 아래와 같습니다.

     

    • main 페이지 접속후 로그인이 되어 있지 않으면 팝업창으로 경고 후 로그인페이지로 이동
    • 로그인 페이지에서 로그인 main페이지로 다시 이동
    • main페이지에서 환영 메세지에 사용자 ID와 함께 메세지창에 표기

     

    위 기능을 구현하기 위해 flash이 외에 session(세션)을 구현하여 ID가 있는지 확인하였습니다.

     

    세션의 예제 코드를 사용하여 변경하였기 때문에 세션에 대해 알고 싶으신 분들은 아래 링크를 참조 하시면 됩니다. 

     

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

     

    세션에 대해 이해를 하신 분은 아래 코드를 바로 보시면 됩니다. 

     

     

    파이썬 코드>>

    from flask import Flask, session, request, render_template, flash, redirect, url_for
    
    app = Flask(__name__)
    app.secret_key = "My_Key"
    
    @app.route('/main')
    def main():
        if 'id' in session:
            id = session['id']
            flash("Welcome {}".format(id))
            return render_template("main.html")  
        else :
            flash("You need to login, first")
            return render_template("login.html")
    
    @app.route('/login', methods = ['GET', 'POST'])
    def login():
        if request.method == 'POST':
            session['id'] = request.form['id']
            return redirect(url_for("main"))
        else:
            return render_template("login.html")  
    
    if __name__ == '__main__':
       app.run(debug = True, port=9999)

     

    10번 라인 : flash 메세지로 사용자의 아이디와 함께 환영 메세지를 보냅니다.

    13번 라인 : 로그인 정보가 없다면 로그인 하라는 메세지를 띄웁니다.

    20번 라인 : 로그인이 되었다면 flash 메세지를 보여 주기 위해 redirect(url_for())를 사용하여 main 함수를 실행 합니다.

     

     

    main.html>>

    {% with messages = get_flashed_messages() %}
        {% if messages %}
            <script>
                alert("{{messages[-1]}}")
            </script>
        {% endif %}
    {% endwith %}
    
    <!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>
        <p>This is Main Page!!</p>
    </body>
    </html>

     

    login.html>>

    {% with messages = get_flashed_messages() %}
        {% if messages %}
            <script>
                alert("{{messages[-1]}}")
            </script>
        {% endif %}
    {% endwith %}
    
    <!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>

     

     

    결과>>

    main 페이지 부터 순차적으로 실행하 결과 입니다.

    반응형