Flask 뷰 구성 실습

프로젝트 구조 분석


Flask뷰/
├── app.py                  # 애플리케이션 진입점
├── config.py               # 환경 설정 파일
├── utils/                  # 유틸리티 함수 모듈
│   ├── __init__.py
│   └── decorators.py       # 사용자 정의 데코레이터
├── blueprints/             # 블루프린트 모듈
│   ├── __init__.py
│   ├── user/               # 사용자 기능 모듈
│   │   ├── __init__.py     # 블루프린트 정의
│   │   └── views.py        # 뷰 함수 구현
│   ├── product/            # 제품 관리 모듈
│   │   ├── __init__.py     # 블루프린트 정의
│   │   └── views.py        # 뷰 함수 구현
│   └── admin/              # 관리자 모듈
│       ├── __init__.py     # 서브도메인 지원 포함
│       └── views.py        # 관리자 뷰 함수
└── templates/              # 템플릿 파일
    ├── index.html          # 메인 페이지
    ├── user/               # 사용자 템플릿
    │   ├── index.html
    │   ├── login.html
    │   ├── register.html
    │   ├── profile.html
    │   └── list.html
    ├── product/            # 제품 템플릿
    │   ├── list.html
    │   └── detail.html
    └── admin/              # 관리자 템플릿
        ├── index.html
        ├── dashboard.html
        ├── users.html
        └── products.html

학습 순서 안내

  1. app.py 확인: Flask 앱 초기화, 블루프린트 등록, 기본 경로 설정 이해
  2. config.py: 개발, 테스트, 운영 환경에 따른 설정 분리 방법 학습
  3. utils/decorators.py: 세션 기반 인증 및 권한 검사 데코레이터 구현 원리 탐구
  4. 블루프린트 모듈 순차 학습:
  • user/: 기본 인증 로직과 함수/클래스 기반 뷰 활용
  • product/: 클래스 기반 뷰의 상속 구조 이해
  • admin/: 서브도메인 설정 및 다중 데코레이터 조합 사용법
  1. 템플릿 파일: 각 모듈별 HTML 템플릿 구조와 링크 연결 방식 분석

핵심 코드 구현

  1. app.py – 주 애플리케이션 설정
from flask import Flask, render_template
from blueprints.user import user_bp
from blueprints.product import product_bp
from blueprints.admin import admin_bp
import os
from config import config, DevelopmentConfig

app = Flask(__name__)
app.config.from_object(DevelopmentConfig)
app.secret_key = os.urandom(16)

# 서브도메인 활성화 (예: admin.example.com)
# app.config['SERVER_NAME'] = 'example.com:5000'

# 블루프린트 등록
app.register_blueprint(user_bp, url_prefix='/user')
app.register_blueprint(product_bp, url_prefix='/product')
app.register_blueprint(admin_bp, url_prefix='/admin')

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

if __name__ == '__main__':
    app.run(debug=True)
  1. config.py – 환경별 설정 관리
class BaseConfig:
    SECRET_KEY = 'secure-secret-key'
    DEBUG = False
    TESTING = False

class DevConfig(BaseConfig):
    DEBUG = True
    DATABASE_URI = 'sqlite:///dev.db'
    TRACK_MODIFICATIONS = False

class TestConfig(BaseConfig):
    TESTING = True
    DATABASE_URI = 'sqlite:///test.db'
    TRACK_MODIFICATIONS = False

class ProdConfig(BaseConfig):
    DATABASE_URI = 'sqlite:///prod.db'
    TRACK_MODIFICATIONS = False

# 환경 매핑
config_map = {
    'development': DevConfig,
    'testing': TestConfig,
    'production': ProdConfig,
    'default': DevConfig
}
  1. utils/decorators.py – 커스텀 보안 데코레이터
from functools import wraps
from flask import request, redirect, url_for, flash, session, abort

def require_login(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        if 'user_id' not in session:
            flash('로그인이 필요합니다.', 'info')
            return redirect(url_for('user.login', next=request.url))
        return func(*args, **kwargs)
    return wrapper

def require_admin(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        if 'user_id' not in session:
            flash('관리자 권한이 필요합니다.', 'error')
            return redirect(url_for('user.login'))
        if session.get('role') != 'admin':
            abort(403)
        return func(*args, **kwargs)
    return wrapper

def require_api_auth(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        auth_key = request.headers.get('Authorization')
        if not auth_key or not auth_key.startswith('Bearer '):
            return {'error': '인증 정보가 누락되었습니다.'}, 401
        token = auth_key.split(' ')[1]
        if token != 'valid-api-token-123':
            return {'error': '유효하지 않은 토큰입니다.'}, 401
        return func(*args, **kwargs)
    return wrapper
  1. 추가 모듈 접근 나머지 블루프린트 내부 코드는 긴 양으로 인해 별도 제공됩니다. 다운로드 링크: [링크] | 비밀번호: 2gq2

태그: flask python 블루프린트 데코레이터 세션

6월 2일 17:54에 게시됨