-
JSON 응답뷰 만들기/ JSON 직렬화카테고리 없음 2021. 11. 23. 15:07
<DRF 설치>
pip install djangorestframework
<프로젝트>/ settings.py / INSTALLED_APPS 에 "rest_framework" 추가
<프로젝트> / urls.py / urlpatterns 다음 패턴 추가
path('api-auth', include('rest_framework.urls')),
serializers.py 생성! : forms.py를 만드는 것과 거의 동일하다
class PostSerializer(ModelSerializer): class Meta: model = Post fields = '__all__'
<httpie 설치>
pip install httpie
http <주소> 를 입력하면 해당 주소의 정보를 얻을 수 있다.
http <method> <주소> <인자 ex) message = ''>를 넣어 사용할 수 있다.
<직렬화(Serialization)>
직렬화: 메모리를 디스크에 저장하거나 네트워크 통신에 사용하기 위한 형식으로 변환하는 것을 말한다.
모든 프로그래밍 언어의 통신에서 데이터는 필히 문자열로 표현되어야만 한다.
언어에 상관없이, 데이터는 값 형식 데이터(Value Type)와 참조 형식 데이터(Reference)가 존재한다. 여기서 참조 형식 데이터는 그대로 가져가더라도 통신할 수 없다. 따라서 직렬화를 통해 유의미한 데이터로 바꾸어 주는 것이다.
serializer
QuerySet ================> JSON화
Model instance <================
deserializer
<JSON 포맷과 PICKLE 포맷>
JSON 포맷
- 다른 언어/플랫폼과 통신할 때 주로 사용.
- 표준 라이브러리 json 제공
- pickle에 비해 직렬화를 지원하는 데이터타입의 수가 적지만, 커스텀 Rule 지정도 가능
PICKLE 포맷
- 파이썬 전용 포맷으로서 파이선 시스템끼리만 통신할 때 사용 가능
- 표준 라이브러리 pickle 제공 -> json 라이브러리가 유사한 사용 방법
- 주의) 파이썬 버전 특성을 타는 경우가 있습니다.
json/pickle 모두 파이썬의 기본 라이브러리 => django 타입 (model/QuerySet)에 대해서는 직렬화 Rule이 없다.
<rest_framework.renderer.JSONRender>
rest_framwork/utils/encoders.py의 JSONEncoder를 통한 직렬화
Model 타입은 미지원 -> ModelSerializer를 통한 변환
<rest_framework.renderer.JSONRenderer>
json.dumps에 대한 래핑 클래스 -> 보다 편리한 직렬화 지원
<ModelSerializer를 통한 JSON 직렬화>
DRF 에서는 ModelSerializer를 통해 JSONRenderer에서 변환 가능한 형태로 먼저 데이터를 변환한다. Serializer/ModelSerializer는 Form/ModelForm과 유사하다. 차이점은 아래와 같다!!
PostSerializer(Post.objects.first()).data = Post의 첫번째 값 출력
PostSerializer(Post.objects.all(), many=True ).data = Post의 모든 값 출력
<뷰에서 JSON응답>
JSON 포맷으로 직렬화된 문자열은 views에서 클라이언트로 넘겨줘야 한다. 넘기는 방식에는 두가지가 존재한다.
- 직접 json.dumps를 통해 직렬화된 문자열을 획득하여 HttpResponse를 통해 응답
- 1번을 정리하여JsonResponse 지원 -> 내부적으로 json.dumps를 사용하며 DjangoJSONEncoder가 디폴트로 지정
<DRF를 통한 JSON응답>
views.py
serializer = PostSerializer(post) serializer.data # {'id': 2, 'title': '제목 내용', 'message': '메세지 내용', 'created_at': '2019-11-18T18:52:57.489893Z', 'update_at': '2019-11-18T19:22:53.717588Z'} type(serializer.data) # <class 'rest_framework.utils.serializer_helpers.ReturnDict'>
serializer = PostSerializer(Post.objects.all()) serializer.data # 오류 serializer = PostSerializer(Post.objects.all(), many=True) serializer.data # [OrderedDict([('id', 2), ('title', '제목 내용'), ('message', '메세지 내용'), ('created_at', '2019-11-18T18:52:57.489893Z'), ('update_at', '2019-11-18T19:22:53.717588Z')]), OrderedDict([('id', 3), ('title', '임시제목'), ('message', 'ㅡㅏㅏ'), ('created_at', '2019-11-18T18:52:57.489893Z'), ('update_at', '2019-11-18T18:52:57.499208Z')])] type(serializer.data) <class 'rest_framework.utils.serializer_helpers.ReturnList'>
위와 같이, json 형태, dict 형태 모두 가져올 수 있다.
<뷰에서의 JSON 응답>
JSON 포맷으로 직렬화된 문자열은 views에서 클라이언트로 넘겨줘야 한다. 이 때, 두가지 방법이 존재한다.
1. json.dumps를 통해 직렬화한 문자열을 HttpResponse를 통해 응답
2. json.dumps가 내장되어 있는 JsonResponse를 통해 응답