프로젝트 구조 분석
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
학습 순서 안내
- app.py 확인: Flask 앱 초기화, 블루프린트 등록, 기본 경로 설정 이해
- config.py: 개발, 테스트, 운영 환경에 따른 설정 분리 방법 학습
- utils/decorators.py: 세션 기반 인증 및 권한 검사 데코레이터 구현 원리 탐구
- 블루프린트 모듈 순차 학습:
user/: 기본 인증 로직과 함수/클래스 기반 뷰 활용product/: 클래스 기반 뷰의 상속 구조 이해admin/: 서브도메인 설정 및 다중 데코레이터 조합 사용법
- 템플릿 파일: 각 모듈별 HTML 템플릿 구조와 링크 연결 방식 분석
핵심 코드 구현
- 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)
- 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
}
- 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
- 추가 모듈 접근 나머지 블루프린트 내부 코드는 긴 양으로 인해 별도 제공됩니다. 다운로드 링크: [링크] | 비밀번호: 2gq2