Django URL 한글 인코딩 방법 feat. 장고 미들웨어 맛보기

Django 로직을 만들다 보면, 여러가지 쿼리 스트링을 가지고 해야할 일이 많다. 쿼리 스트링에 한글이 들어와 있으면 표현이 이상한 코드들이 막 나오는 것을 볼 수 있다. 이 부분을 변경해서 사용해야 한다.

 

여기서 정리한 모든 내용은 현재 듣고 있는 장고 강의에 소스에 포함된 내용을 공부할 겸 추려본다 - Django 실전 프로젝트 1 - URL Shortener 서비스 ( 패스트캠퍼스 )

 

관련 코드는 아래와 같다.

    @staticmethod
    def form_data_to_dict(body: bytes):
        UNLOGGABLES = ["csrfmiddlewaretoken", "password"]
        body = body.decode("utf-8")
        body = unquote(body).split("&")
        rtn = {}

일단 decode utf-8 로 한다음 저장하면

한글이 무난하게 한글로 저장된다.

 

그리고 & 로 분리하면 쿼리 스트링의 인자들을 list (dict) 형태로 저장해서 활용할 수 있다. 

간단한 코드지만, 자주 쓰게 되니깐 인지하고 있고 

 

미들웨어 작성시에 미리 함수 부르기 전에 이 작업을 해두고, 호출 하도록 하면 input output 형태가 고정되도록 함수 단위를 구성할 수 있으니 큰 장점이 된다. 필요없는 부분은 필터링 할 수 도 있고, 약간 쓰기 편하게 변경해 사용해도 되고

 

미들웨어 호출 방법은 간단하게 넣어두고 좀 찾아보고 정리해 보자.

 

settings.py 에 일단 넣어두고

MIDDLEWARE = [
...
"shortener.middleware.ShrinkersMiddleware",
]

 

함수 구현에 가서는 class 구현 부분에 아래 __call__ 부분

get_response() 를 기준으로 전 후 를 나눌 수 있다.

 

요청 전에 처리해야할 전필터 기능들을 넣어두고, 

요청 이후 처리는 기밀 정보 마스킹, 숨기기 등등등 후필터링을 적용할 수 있다. (힘들어 지는데...)

 

즉, main 함수는 get_response() 안에서 처리가 끝나게 되고 이를 한 번 싸고 있다고 생각하면 된다.

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

    def __call__(self, request):
        request.users_id = None
        print("=== 언제 불려지노? ===")        


		response = self.get_response(request)

        if request.method not in ["GET", "OPTIONS"]:
            self.log_action(request, response)

        return response

 

정리는 잘 안되지만 일단 적어두고, 정리를 더 하자.

 

 포장을 잘해야 가치가 더 빛난다 :)

Any Lane 님의 사진, 출처: Pexels