Django Middleware

박병현·2024년 6월 5일
0

1. 미들웨어란?

미들웨어(Middleware)는 소프트웨어 개발에서 여러 컴포넌트들 간의 통신을 중개하거나 변형하는 소프트웨어 디자인 패턴입니다. Django에서의 미들웨어는 웹 애플리케이션의 요청과 응답을 처리하는 핵심 요소 중 하나입니다. 이는 요청이 처리되기 전과 후에 실행되어 요청과 응답을 수정하거나 처리할 수 있습니다.

2. 미들웨어의 역할

미들웨어는 다음과 같은 역할을 수행합니다.

  • 요청 처리: 클라이언트로부터의 요청이 Django 애플리케이션에 도달하면, 미들웨어는 요청을 처리하기 위해 순차적으로 실행됩니다. 각 미들웨어는 요청 객체를 받아 다음 미들웨어로 전달할 수 있습니다.
  • 응답 처리: Django 애플리케이션이 응답을 생성하면, 미들웨어는 이 응답을 수정하거나 추가 작업을 수행할 기회를 가집니다. 미들웨어는 응답을 변경하거나 재정의하여 클라이언트에게 전송될 최종 결과를 조작할 수 있습니다.

3. 미들웨어 소스코드

함수 형태의 미들웨어

def simple_middleware(get_response):
    # One-time configuration and initialization.

    def middleware(request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.

        response = get_response(request)

        # Code to be executed for each request/response after
        # the view is called.

        return response

    return middleware

클래스 형태의 미들웨어

class SimpleMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        # One-time configuration and initialization.

    def __call__(self, request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.

        response = self.get_response(request)

        # Code to be executed for each request/response after
        # the view is called.

        return response

4. 팩토리 메소드 패턴과 get_response

  • 팩토리 메소드 패턴은 객체 생성을 서브 클래스에서 결정하도록 하는 디자인 패턴입니다.
  • Django의 미들웨어에서는 팩토리 메소드 패턴을 활용하여 각 미들웨어가 요청을 처리하고 다음 미들웨어로 전달할 수 있도록 합니다.

5. Middleware Hook

미들웨어에서는 특정 메소드를 구현하여 요청 및 응답을 처리할 수 있습니다.

  • process_view(): Django가 뷰를 호출하기 전에 호출됩니다.
  • process_exception(): 뷰에서 예외가 발생할 때 호출됩니다.
  • process_template_response(): 뷰가 실행된 후에 호출되며, 응답이 템플릿 렌더링을 포함하는 경우에만 호출됩니다.

예시

class CustomMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def process_view(self, request, view_func, view_args, view_kwargs):
        # 뷰 실행 전에 호출됩니다.
        # request: HttpRequest 객체
        # view_func: 호출할 뷰 함수
        # view_args: 뷰 함수에 전달될 위치 인수
        # view_kwargs: 뷰 함수에 전달될 키워드 인수
        pass

    def process_exception(self, request, exception):
        # 뷰에서 예외가 발생할 때 호출됩니다.
        # request: HttpRequest 객체
        # exception: 발생한 예외 객체
        pass

    def process_template_response(self, request, response):
        # 템플릿 응답 객체를 받아 처리합니다.
        # request: HttpRequest 객체
        # response: TemplateResponse 객체
        pass

6. Middleware order and layering

  • 미들웨어는 요청 단계에서는 상위에서 하위
  • 응답 단계에서는 하위에서 상위로 순차적으로 실행됩니다.

참고링크 : https://docs.djangoproject.com/en/2.2/topics/http/middleware/#

profile
AI Application Engineer

0개의 댓글