모드감지
# shared_kernel/middleware/mode_detector.py
import threading
class ModeDetector:
_mode = threading.local()
@classmethod
def set_mode(cls, is_online):
cls._mode.is_online = is_online
@classmethod
def is_online(cls):
return getattr(cls._mode, 'is_online', False)
class ModeDetectorMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# 여기서 온라인 상태를 확인하는 로직을 구현
# 예를 들어, 서버와의 연결 상태를 체크
is_online = self.check_online_status()
ModeDetector.set_mode(is_online)
response = self.get_response(request)
return response
def check_online_status(self):
# 실제 구현에서는 서버와의 연결을 확인하는 로직 필요
return True # 예시로 항상 온라인이라고 가정
ModeDetector는 현재 모드(온라인/오프라인)를 저장하고 확인하는 클래스.
ModeDetectorMiddleware는 각 요청마다 온라인 상태를 확인하고 설정.
threading.local()을 사용해서 각 요청마다 독립적으로 모드를 관리.
요청처리
# shared_kernel/decorators/mode_specific.py
from functools import wraps
from shared_kernel.middleware.mode_detector import ModeDetector
def mode_specific(view_func):
@wraps(view_func)
def wrapper(*args, **kwargs):
if ModeDetector.is_online():
# 온라인 모드: 서버 로직 사용
return view_func(*args, **kwargs)
else:
# 오프라인 모드: 로컬 로직 사용
return offline_handler(*args, **kwargs)
return wrapper
def offline_handler(*args, **kwargs):
# 오프라인 모드에서의 처리 로직
# 예: 로컬 데이터베이스 사용, 제한된 기능 제공 등
pass
mode_specific 데코레이터는 뷰 함수를 래핑.
- 현재 모드를 확인해서 온라인이면 기능 위임 함수를 실행하고, 오프라인이면
offline_handler를 실행.
# information_registration/presentation/views.py
from shared_kernel.decorators.mode_specific import mode_specific
from django.http import JsonResponse
@mode_specific
def register_information(request):
# 온라인 모드에서의 정보 등록 로직
# 이 함수는 온라인 모드에서만 실행됨
data = request.POST.get('data')
# 데이터 처리 로직...
return JsonResponse({"status": "success", "message": "정보가 등록되었습니다."})
# offline_handler 함수는 shared_kernel/decorators/mode_specific.py에 정의되어 있음
# 오프라인 모드에서는 이 함수가 대신 실행됨
- 각 뷰 함수에
@mode_specific 데코레이터를 붙여서 사용.
- 온라인 모드에서는 서버에 기능을 위임해 서버에서 응답값을 받음.
- 오프라인 모드에서는
offline_handler가 대신 실행되어 독립적으로 구동.