TIL

TIL.71 JsonResponse 활용

codermun 2020. 12. 18. 21:53
728x90
반응형

프로젝트 진행 중 확인한 내용으로 어떻게 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

 

Django - HttpRequest, HttpResponse, Render, JsonResponse

이 내용은 장고 Request and response objects 공식문서를 요약/정리한 내용입니다. 1. Overview 장고는 request와 response 객체로 상태를 서버와 클라이언트가 주고 받습니다.

velog.io

 

728x90
반응형