Flask, MySQL 세션를 이용한 로그인/로그아웃 예제

 Flask 를 이용하여 MySQL 데이터베이스에 로그인하고 로그아웃하는 기본적인 Flask 예제입니다.

이 예제는 매우 단순한 형태이므로 실제 웹 애플리케이션에서는 보안, 에러 처리 등을 고려해야 합니다.

 

Flask 와 MySQL 로그인/로그아웃 예제

 

라이브러리 설치

$ pip install flask flask-mysqldb

 

디렉토리 구조

/flaskapp
  /templates
    home.html
    login.html
  app.py

 

app.py

from flask import Flask, render_template, request, redirect, url_for, session
from flask_mysqldb import MySQL
import MySQLdb.cursors
import re

app = Flask(__name__)

# MySQL 데이터베이스를 Flask에 연결
app.config['MYSQL_HOST'] = 'localhost'
app.config['MYSQL_USER'] = 'root'
app.config['MYSQL_PASSWORD'] = 'root'
app.config['MYSQL_DB'] = 'myflaskapp'

mysql = MySQL(app)

# Secret key 설정
app.secret_key = 'your-secret-key'

@app.route('/')
def home():
    # 사용자가 로그인한 경우 home.html을 반환, 아니면 로그인 페이지로 리다이렉트
    if 'loggedin' in session:
        return render_template('home.html', username=session['username'])
    return redirect(url_for('login'))


@app.route('/login', methods=['GET', 'POST'])
def login():
    # 출력 메시지를 사용자에게 보여주기 위한 변수
    msg = ''
    # 요청 메서드가 POST인 경우
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        # MySQL을 사용하여 사용자 이름 및 암호 확인
        cursor = mysql.connection.cursor(MySQLdb.cursors.DictCursor)
        cursor.execute('SELECT * FROM accounts WHERE username = %s AND password = %s', (username, password,))
        account = cursor.fetchone()
        # 계정이 존재하는 경우
        if account:
            session['loggedin'] = True
            session['id'] = account['id']
            session['username'] = account['username']
            # 로그인 성공적으로 되었을 경우 홈 페이지로 이동
            return redirect(url_for('home'))
        else:
            # 로그인 실패 시 메시지
            msg = 'Incorrect username or password!'
    # 로그인 페이지를 보여주기 위한 메시지를 전달
    return render_template('login.html', msg=msg)


@app.route('/logout')
def logout():
   # 로그아웃하면 세션 데이터를 지움
   session.pop('loggedin', None)
   session.pop('id', None)
   session.pop('username', None)
   # 로그인 페이지로 리다이렉트
   return redirect(url_for('login'))

if __name__ == '__main__':
    app.run(debug=True)

 

templates/home.html

<!DOCTYPE html>
<html>
<body>
  <h1>Welcome, {{ username }}!</h1>
  <a href="/logout">Log Out</a>
</body>
</html>

 

templates/login.html

<!DOCTYPE html>
<html>
<body>
  <form method="POST">
    <input type="text" name="username" placeholder="Username" required>
    <input type="password" name="password" placeholder="Password" required>
    <input type="submit" value="Login">
  </form>
  <p>{{ msg }}</p>
</body>
</html>

 

SQL

# Table 생성
CREATE TABLE accounts (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL,
    password VARCHAR(255) NOT NULL
);

# Test 계정
INSERT INTO accounts (username, password) VALUES ('testuser', 'testpass');