Django Middleware Custom

장태순
5 min readFeb 4, 2021

Django의 요청 / 응답 처리에 대한 후크 프레임 워크로써 Django 상의 모든 API 입출력을 전역적으로 변경하기 위한 플러그인 시스템이다.

Default로 django middleware 가 존재한다. django project의 기본 settings에 정의 되어 있다.

MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
]

위에서 부터 순차적으로 middleware가 실행된다. 맨 처음에 request 가 들어오면 SecurityMiddleware가 실행 한 뒤 SessionMiddleware, XFrameOptionsMiddleware까지 실행되면서 각 미들웨어에서 process_request(), process_view() 메서드를 실행한다.

그 다음 django view단에서 모든 작업을 실행하고 클라이언트에 대한 response를 반환하는데 이 때는 아래서 부터 위로 실행된다.
각 미들웨어 대해 process_exception(), process_template_response(), process_response() 메서드를 실행한다. 다만 에러가 발생하면 process_response() 대신 process_exception() 실행, 템플릿 응답일 경우 process_template_response()를 실행한다.
커스텀 미들웨어는 만든뒤 [] 에 추가해주면된다.

Middleware Hook

  1. request middleware hook
  • process_request(request)
  • process_view(request, view_func, view_args, view_kwargs)

2. response middleware hook

  • process_exception(request, exception) (only if the view raised an exception)
  • process_template_response(request, response) (only for template responses)
  • process_response(request, response)

Middleware Custom Class

각자의 미들웨어의 기본 프레임은 get_response를 불러내고 미들웨어를 return 하는 방식이다.
class 형식의 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

하나의 미들웨어는 순차적으로 실행이되며 위의 django middleware 설정하는 곳이 있고 custom middleware을 기입하게 되면 위에서 부터 순차적으로 실행이 된다.

__init__(get_response)

get_response argument을 무조건 가지고 있어야 하고 유일한 인자로서 받아야 django 상의 middleware로서 작동한다.
get_response는 장고의 미들웨어를 호출할 때 넘겨주는 함수로써 view에 넘기거나 혹은 다른 미들웨어로 넘기게 된다.

구현

구현한뒤에 setting middleware에 추가한다.

middleware class에서 hook을 이용한 예시

request에 logging을 남기기 위한 custom_middleware class 이다.

--

--