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
정리는 잘 안되지만 일단 적어두고, 정리를 더 하자.