[Django] Middleware

2024. 2. 2. 09:25Django

728x90
  • HTTP 요청 / 응답 처리 중간에서 작동하는 시스템
  • HTTP 요청이 들어오면 미들웨어를 거쳐서 해당 URL 등록되어 있는 뷰로 연결해주고, HTTP 역시 미들웨어를 거쳐서 내보낸다
  •  

Django에서 미들웨어는 http 요청 또는 응답 전처리에 사용된다

 

Setting.py에서 MIDDLEWARE의 full python path를 추가하면 된다

 

Django-admin startproject 명령어로 django project 생성 시 기본적으로 미들웨어들이 등록되어 있다

 

미들웨어 등록시 가장 중요한 것은 미들웨어를 등록하는 순서다.

 

미들웨어 등록 순서가 가지는 의미

  • HTTP request가 들어오면 위에서부터 아래로 미들웨어를 적용
  • HTTP response가 나갈 때 아래서부터 위로 미들웨어를 적용

 

 

Custom Middleware

: 함수나 클래스로 작성이 가능

 

함수로 작성

  • 팩토리 형식 사용

 

Factory Method Pattern

특정 역할을 가진 객체를 생성하는 기능을 수행한다고 있으며, 객체에서 만들어내는 부분을 서브 클래스에 위임하는 패턴이다.

# custom Middleware

def my_middleware(get_response):

    def middleware(request):
    	# Pre - Viewing
    		
        response = get_response(request)
        	
        # Post - Viewing
        return response
    
    return middleware
  • My_middleware : get_response 함수를 받는 하나의 함수이며, middleware라는 내부 함수를 반환
  • My_middleware 함수 상단에는 최초 설정 및 초기화를 진행
  • Middleware 내부 함수에서는 request를 받아 최종적으로 response를 반환
  • Get_response 함수를 호출하기 전후로 나누어 생각할 수 있는데, view가 호출되기 전과 view가 호출되고 난 후 처리할 일들을 나누어 작성

 

클래스로 작성

  • 구조화된 미들웨어를 작성할 있게 된다
class MyMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        
    def __call__(self, request):
        # Pre - Viewing
        
        response = self.get_response(request)
        
        # Post - Viewing
        
        return response
  • __init__과 __call__ 두 개로 나뉨
  • __init__ : 최초 설정 및 초기화 진행
  • __call__ : request를 받아서 response를 리턴
  • Get_response : Django에서 미들웨어를 호출할 때 넘겨주는 하나의 함수이며, view거나 다른 미들웨어일 수 있다

 

Middleware Hook

  • 클래스 형식으로 미들웨어 정의시 http 요청/응답에 대한 처리를 하게되는 메서드 추가 정의
  • http 요청/응답에 대한 처리를 하게되는 메서드를 추가 정의

 

HTTP 요청 미들웨어

def process_request(request)

# Django가 view를 호출하기 바로 직전에 불리는 훅
# None이나 HttpResponse 객체를 리턴
# None -> view 호출 -> HttpResponse 리턴 -> middleware로 다시 전송

def process_view(request, view_func, view_args, view_kwargs)

 

HTTP 응답 미들웨어

# view가 exception 발생 시 호출
def process_exception(request, exception)

# response가 template을 반환하는 경우
def process_template_response(request, response)

def process_response(request, response)
728x90

'Django' 카테고리의 다른 글

[Django] Django Throttling  (1) 2024.02.02
[Django] 로그 설정하는 법  (0) 2024.01.10
[Django] CHAR 적용하기  (1) 2024.01.02
[Django] Mysql-client 설치 오류  (0) 2023.11.12
Django Signals  (1) 2023.11.12