ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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를 통해 응답

     

Designed by Tistory.