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
반응형