본문 바로가기
Coding/Python

Django Middleware로 특정 주소 Redirect 시키는 방법

by Hide­ 2019. 10. 21.
반응형

현재 서버는 모든 요청이 API Gateway를 한번 거쳐서 들어오는 형태로 구성되어있다. 각 서비스별로 팀내에서 부를 용어를 통일하기위해 hide처럼 임의의 명칭을 부여했고, 모든 요청앞에 /hide/와 같은 형태로 prefix를 붙이기로 했다.

기존에는 /api/v1/로 시작하는 URL들의 집합체였는데, 모든 URL들에 prefix를 붙이자니 조금 번거로운 작업이 될 것으로 생각하여 Django의 Middleware에 훅을 거는 방식으로 진행하였다.

위 사진을 보면 어떠한 형태로 Django의 Request/Response가 처리되는지 한눈에 알 수 있을 것이다. 우리는 Request가 들어올 때 prefix를 붙여주는 작업을 진행해야하므로 Request Middleware를 생성하기로 했다.

from django.shortcuts import redirect


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

    def __call__(self, request):
        response = self.get_response(request)

        if request.environ['PATH_INFO'].startswith('hide/api/v1/users'):
            return redirect('api/v1/users')
        return response

먼저 파일을 하나 생성하고 위 내용을 채워넣는다. request.environ['PATH_INFO']에 어떠한 URL로 들어왔는지 정보가 담기므로 해당 URL의 시작이 /hide/api/v1/users라면, /api/v1/users로 리다이렉트 시키는 미들웨어이다.

다음으로 settings.py에서 MIDDLEWARE 리스트를 찾고 아래의 내용을 추가한다.

'폴더명.파일명.클래스명'

예를 들어 hides폴더 아래에 middle.py파일이 있고 해당 파일에 Redirect Middleware라는 클래스를 작성했다면,

'hides.middle.RedirectMiddleware'라고 작성하면 된다.

이제 요청을 해보면 정상적으로 우리가 지정한 주소로 리다이렉트됨을 확인할 수 있다.

주의사항
Query String, HTTP Body와 같은 정보는 리다이렉트될 때 같이 전달되지 않는다.