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
- 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 이다.
Description