-
TIL.71 JsonResponse 활용TIL 2020. 12. 18. 21:53728x90
프로젝트 진행 중 확인한 내용으로 어떻게 JsonResponse 활용할 수 있는지 알아보자.
JsonResponse
JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None, **kwargs)
- HttpResponse의 subclass로, JSON-encoded response를 생성할수 있게 해 줌. 대부분의 기능은 superclass에서 상속받음
- 첫번째 인자로는 전달할 데이터로서 반드시 dictionary 객체여야 함.
- 디폴트 Content-type 헤더는 application/json임
- encoder는 데이터를 serialize할 때 이용됨.
- json_dumps_params는 json.dumps()에 전달할 딕셔너리의 keyword arguments임
여지껏 HTTP 통신간 요청에 대한 응답으로 JsonResponse를 사용해 왔었다.
보통아래와 같이 작성하여 요청에 대한 응답으로 status code와 함께 body에 담아 전달해줄수 있다.
product_values = Product.objects.all().order_by('-id') product_data = json.loads(serialize('json', product_values)) return JsonResponse( {'products':product_data}, status=200)
하지만 여기서 더 나아가 아래와 같은 방식으로 전달하고자 하는 데이터를 추가하여 전달하는 것이 가능하다.
(여기서는 반복문이 아닌 serialize 함수를 사용하여 JSON 데이터로 변환하여 body에 담아주었다)
product_values = Product.objects.all().order_by('-id') product_data = json.loads(serialize('json', product_values)) category_values = Category.objects.all().order_by('-id') category_data = json.loads(serialize('json', category_values)) menu_values = Menu.objects.all().order_by('-id') menu_data = json.loads(serialize('json', menu_values)) image_values = Image.objects.all().order_by('-id') image_data = json.loads(serialize('json', image_values)) return JsonResponse( {'products':product_data, 'categories':category_data, 'menus':menu_data, 'images':image_data } )
정보의 양이 많아 다 담지 못하였지만 위의 menu, category, product, image등 모든 정보를 담아 전달할 수 있었다.
물론 이렇게 데이터를 전달해도 프론트에서 원하는 값을 찾을 수 있지만
이것보다 더 깔끔하고 더 개발자스러운 select_related 와 prefetch_related 를 이용하여 프로젝트를 진행해보도록 하자.
출처 : velog.io/@jcinsh/Django-request-response
728x90'TIL' 카테고리의 다른 글
TIL.73 Github / Git 충돌(Conflict) 발생 해결 (0) 2020.12.20 TIL.72 select_related 와 prefetch_related (1) 2020.12.19 TIL.67 Trello 다루기 (0) 2020.12.14 TIL.66 스크럼(Scrum) (0) 2020.12.13 TIL. 62 회원가입, 로그인 _ HTTP 통신 (0) 2020.12.09