ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Django] Middleware
    Django 2024. 2. 2. 09:25
    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
Designed by Tistory.