파이썬 Flask를 이용한 통계 서버 구조 및 설명


1. 기본 서버 구조

statistics_server/
├── app.py                 # Flask 서버 메인 파일
├── static/                 # 정적 파일 (JS, CSS)
├── templates/              # HTML 템플릿 폴더
│   └── index.html          # 기본 대시보드 페이지
├── data/                   # 데이터 저장 (CSV, SQLite 등)
│   └── sales_data.db       # SQLite 데이터베이스 파일
└── requirements.txt        # 필요한 패키지 목록

2. 주요 파일 설명

app.py

Flask 서버를 초기화하고 라우트를 정의합니다.

from flask import Flask, render_template, request, jsonify
import sqlite3

app = Flask(__name__)

# DB 연결 함수
def get_db_connection():
    conn = sqlite3.connect('data/sales_data.db')
    conn.row_factory = sqlite3.Row
    return conn

# 메인 대시보드
@app.route('/')
def index():
    conn = get_db_connection()
    sales_data = conn.execute('SELECT * FROM sales').fetchall()
    conn.close()
    return render_template('index.html', sales=sales_data)

# API: 특정 통계 제공 (예: 총 매출)
@app.route('/api/total_sales', methods=['GET'])
def total_sales():
    conn = get_db_connection()
    result = conn.execute('SELECT SUM(amount) as total FROM sales').fetchone()
    conn.close()
    return jsonify({"total_sales": result['total']})

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

데이터베이스 스키마 예시

SQLite로 테이블 구성

CREATE TABLE sales (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    product TEXT,
    category TEXT,
    amount REAL,
    date TEXT
);

템플릿 파일: templates/index.html

데이터를 대시보드 형태로 표시합니다.

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>통계 대시보드</title>
  <style>
    body { font-family: Arial, sans-serif; }
    table { width: 100%; border-collapse: collapse; }
    th, td { padding: 8px; text-align: left; border: 1px solid #ddd; }
  </style>
</head>
<body>
  <h1>판매 통계 대시보드</h1>
  <table>
    <thead>
      <tr>
        <th>ID</th>
        <th>제품명</th>
        <th>카테고리</th>
        <th>금액</th>
        <th>날짜</th>
      </tr>
    </thead>
    <tbody>
      {% for sale in sales %}
      <tr>
        <td>{{ sale.id }}</td>
        <td>{{ sale.product }}</td>
        <td>{{ sale.category }}</td>
        <td>{{ sale.amount }}</td>
        <td>{{ sale.date }}</td>
      </tr>
      {% endfor %}
    </tbody>
  </table>
</body>
</html>

3. 통계 서버 기능 구성

기능 설명

데이터 조회 데이터베이스에서 판매 데이터를 조회
통계 API 제공 /api/total_sales 경로에서 총 매출 데이터를 JSON으로 반환
데이터 시각화 HTML 템플릿에서 데이터를 표 형태로 렌더링
사용자 요청 처리 Flask 라우트를 통해 사용자 요청 처리

4. 확장 아이디어

  1. 시각화 추가:
    • Chart.js 또는 Plotly.js를 사용해 그래프 시각화
  2. 데이터 입력 API:
  3. @app.route('/api/add_sale', methods=['POST']) def add_sale(): data = request.json conn = get_db_connection() conn.execute('INSERT INTO sales (product, category, amount, date) VALUES (?, ?, ?, ?)', (data['product'], data['category'], data['amount'], data['date'])) conn.commit() conn.close() return jsonify({"status": "success"})
  4. 보안 강화:
    • JWT 인증, API Rate Limiting 적용
  5. 데이터 분석 모듈:
    • Pandas를 사용해 복잡한 통계 연산 추가

위 구조를 통해 Flask로 통계 서버를 구축하고 다양한 통계 데이터를 사용자에게 제공할 수 있습니다.

파이썬 Flask에서 세션, 로그인, 로그아웃 구현

Flask는 간단하고 유연한 파이썬 웹 프레임워크로, 세션 관리 및 사용자 인증 기능을 쉽게 구현할 수 있습니다. 이 기능을 활용하여 웹 애플리케이션에서 로그인, 로그아웃을 구현하고 사용자의 상태를 관리할 수 있습니다.

1. Flask 세션이란?

세션(session)은 클라이언트가 웹 애플리케이션에 접속한 후, 서버에서 클라이언트와의 상호작용 상태를 유지하기 위한 저장 공간입니다. Flask에서는 session 객체를 사용하여 세션 데이터를 저장할 수 있으며, 이 데이터는 클라이언트의 쿠키에 저장됩니다. Flask는 쿠키의 무결성을 보장하기 위해 비밀 키(Secret Key)를 사용하여 세션 데이터를 서명합니다.

2. Flask-Login이란?

Flask-Login은 Flask 애플리케이션에서 사용자 로그인, 로그아웃, 세션 관리 등을 쉽게 구현할 수 있는 확장 라이브러리입니다. 주로 사용자의 인증 및 세션 관리를 다룹니다.

주요 기능:

  • 사용자 로그인 및 로그아웃 관리
  • 사용자 세션 유지 (로그인 상태)
  • 로그인하지 않은 사용자에 대한 페이지 접근 제한
  • Remember Me 기능을 통한 지속적인 로그인 세션

설치

pip install flask flask-login

3. 기본 Flask 세션 및 로그인 예제

다음은 기본적인 Flask에서의 세션과 로그인, 로그아웃 구현 예제입니다.

from flask import Flask, render_template, redirect, url_for, request, session, flash
from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user

app = Flask(__name__)

# 세션을 위한 비밀 키 설정
app.secret_key = 'your_secret_key'

# Flask-Login 설정
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login'  # 로그인 페이지 경로 설정

# 사용자 정보를 담을 가상의 사용자 데이터베이스 (딕셔너리 형태로 간단히 구현)
users = {
    'admin': {'password': 'secret'}
}

# 사용자 클래스를 정의
class User(UserMixin):
    def __init__(self, username):
        self.id = username

# Flask-Login은 사용자를 로드하는 함수 필요
@login_manager.user_loader
def load_user(username):
    if username in users:
        return User(username)
    return None

# 홈 페이지
@app.route('/')
@login_required
def home():
    return f'Hello, {current_user.id}! You are logged in.'

# 로그인 페이지
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']

        # 사용자 인증
        if username in users and users[username]['password'] == password:
            user = User(username)
            login_user(user)  # 로그인 처리
            flash('Logged in successfully!')
            return redirect(url_for('home'))  # 로그인 후 홈으로 이동
        else:
            flash('Invalid username or password')  # 잘못된 로그인 정보

    return render_template('login.html')

# 로그아웃 처리
@app.route('/logout')
@login_required
def logout():
    logout_user()  # Flask-Login에서 제공하는 로그아웃 함수
    flash('You have been logged out.')
    return redirect(url_for('login'))

# 로그인 상태에서만 접근 가능한 페이지
@app.route('/protected')
@login_required
def protected():
    return 'This is a protected page. Only logged-in users can see this.'

# 서버 실행
if __name__ == '__main__':
    app.run(debug=True)

4. 코드 설명

1. Flask 기본 설정

app = Flask(__name__)
app.secret_key = 'your_secret_key'  # 세션을 위한 비밀 키

Flask 애플리케이션을 생성하고, 세션 데이터 보호를 위해 secret_key를 설정합니다. 이 키는 세션 데이터를 서명하여 조작되지 않도록 보호합니다.

2. Flask-Login 설정

login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login'

Flask-Login의 인스턴스를 생성하고, Flask 애플리케이션에 등록합니다. login_view는 로그인하지 않은 사용자가 접근할 수 없는 페이지에 접근할 때 리디렉션될 로그인 페이지 경로입니다.

3. 사용자 클래스 정의 (UserMixin)

class User(UserMixin):
    def __init__(self, username):
        self.id = username

Flask-LoginUserMixin을 사용하는 User 클래스를 요구합니다. 이 클래스는 로그인한 사용자의 ID를 관리하고 UserMixin을 상속받아 여러 유틸리티 메서드를 사용할 수 있습니다.

4. 로그인 사용자 로드 함수

@login_manager.user_loader
def load_user(username):
    if username in users:
        return User(username)
    return None

Flask-Login은 사용자 정보를 세션에서 가져오기 위해 사용자 로딩 함수가 필요합니다. 이 함수는 사용자 ID를 사용해 사용자를 데이터베이스에서 가져옵니다.

5. 로그인 처리

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']

        # 사용자 인증
        if username in users and users[username]['password'] == password:
            user = User(username)
            login_user(user)
            flash('Logged in successfully!')
            return redirect(url_for('home'))
        else:
            flash('Invalid username or password')

    return render_template('login.html')
  • 로그인 페이지는 GET 요청 시 화면에 표시됩니다.
  • POST 요청 시, 사용자 입력 정보를 통해 인증을 수행하고, 인증 성공 시 login_user()를 통해 세션을 시작합니다.

6. 로그아웃 처리

@app.route('/logout')
@login_required
def logout():
    logout_user()  # Flask-Login에서 제공하는 로그아웃 함수
    flash('You have been logged out.')
    return redirect(url_for('login'))
  • logout_user()를 호출하여 사용자의 세션을 종료합니다.

7. 로그인 필수 데코레이터 (@login_required)

@app.route('/protected')
@login_required
def protected():
    return 'This is a protected page. Only logged-in users can see this.'

@login_required 데코레이터를 사용하여 로그인한 사용자만 접근할 수 있는 페이지를 정의할 수 있습니다. 로그인하지 않은 사용자가 이 페이지에 접근하려고 하면 login_view로 리디렉션됩니다.

5. 로그인 페이지 템플릿 (login.html)

로그인 화면을 위한 간단한 HTML 템플릿입니다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Login</title>
</head>
<body>
    <h2>Login</h2>
    <form method="POST" action="/login">
        <label for="username">Username:</label>
        <input type="text" name="username" id="username" required>
        <br>
        <label for="password">Password:</label>
        <input type="password" name="password" id="password" required>
        <br>
        <button type="submit">Login</button>
    </form>

    {% with messages = get_flashed_messages() %}
      {% if messages %}
        <ul>
        {% for message in messages %}
          <li>{{ message }}</li>
        {% endfor %}
        </ul>
      {% endif %}
    {% endwith %}
</body>
</html>

설명:

  • 사용자 이름과 비밀번호를 입력받고 POST 요청으로 로그인 폼을 제출합니다.
  • 로그인 시 오류가 있으면 Flash 메시지를 통해 사용자에게 알립니다.

결론

이 예제에서는 Flask 세션Flask-Login을 사용하여 로그인과 로그아웃 기능을 구현하는 방법을 다뤘습니다. Flask-Login은 로그인한 사용자 세션을 관리하고, 로그인하지 않은 사용자가 접근할 수 없는 페이지를 보호하는 데 매우 유용합니다. 비동기 작업이나 데이터베이스 연동 등과 함께 사용할 수 있으며, 더 복잡한 인증 시스템을 구현할 때 매우 유용한 도구입니다.

추가적으로 구현하고 싶은 기능이나 질문이 있으면 언제든지 알려주세요!

파이썬의 마이크로 웹 프레임워크 중 Flask를 예로 들어 구조와 간단한 코드 예제를 설명해 드리겠습니다. Flask는 간단하면서도 유연성이 뛰어난 프레임워크로, 웹 애플리케이션 개발에 매우 적합합니다.

Flask 구조

Flask 애플리케이션의 기본 구조는 다음과 같습니다:

my_flask_app/
│
├── app.py         # 메인 애플리케이션 파일
├── templates/     # HTML 템플릿 파일
│   └── index.html
├── static/        # 정적 파일 (CSS, JS, 이미지 등)
│   ├── styles.css
│   └── script.js
└── requirements.txt # 필요한 패키지 목록

예제 코드

아래는 Flask로 간단한 웹 애플리케이션을 만드는 예제입니다.

1. app.py

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def home():
    return render_template('index.html')

@app.route('/about')
def about():
    return '<h1>About Page</h1>'

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

2. templates/index.html

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="{{ url_for('static', filename='styles.css') }}">
    <title>Flask 예제</title>
</head>
<body>
    <h1>환영합니다!</h1>
    <p><a href="/about">About 페이지</a></p>
</body>
</html>

3. static/styles.css

body {
    font-family: Arial, sans-serif;
    margin: 20px;
}

h1 {
    color: #333;
}

a {
    text-decoration: none;
    color: #007BFF;
}

실행 방법

  1. 필요한 패키지 설치: requirements.txt 파일을 만들고 다음 내용을 추가합니다.

    Flask

    그런 다음, 아래 명령어로 패키지를 설치합니다.

    pip install -r requirements.txt
  2. 애플리케이션 실행: 아래 명령어로 Flask 애플리케이션을 실행합니다.

    python app.py
  3. 웹 브라우저에서 접속: 웹 브라우저를 열고 http://127.0.0.1:5000/로 접속하면 "환영합니다!"라는 메시지가 보이고, "About 페이지" 링크를 클릭하면 About 페이지로 이동합니다.

이렇게 Flask를 사용하여 간단한 웹 애플리케이션을 만들어볼 수 있습니다. 더 복잡한 기능이나 추가적인 질문이 있으시면 말씀해 주세요!

+ Recent posts