-
[Django] MiddlewareDjango 2024. 2. 2. 09:25728x90
- 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