DRF 의 요청 과 응답의 실현

1 요청 과 응답
1.1 요청

#     
# from rest_framework.request import Request
    def __init__(self, request, parsers=None, authenticators=None,
                 negotiator=None, parser_context=None):
        #     request,   request  drf request    _request   
        self._request = request
    def __getattr__(self,item):
     return getattr(self._request,item)
#     .data:              ,      
#     ..query_params  Django   request.GET  ,             。
1.2 응답

#from rest_framework.response import Response
 def __init__(self, data=None, status=None,
                 template_name=None, headers=None,
                 exception=False, content_type=None):
        
#data:       ,  
#status:      ,   200,
 -from rest_framework import status      ,                  
#template_name        (     ),     
#headers:   ,         ,      
#content_type:       ,application/json text/html;

#             ,postman   json  ,       (    )
#   postman     ,   json    
# drf        ---》     setting  ,   ,     
# drf     ,       --》   setting  ---》    
 -    :        
        -        
        from rest_framework.renderers import JSONRenderer
        renderer_classes=[JSONRenderer,]
    -    :      ,    ,   
     - setting.py     
        REST_FRAMEWORK = {
            'DEFAULT_RENDERER_CLASSES': (  #        
                'rest_framework.renderers.JSONRenderer',  # json   
                'rest_framework.renderers.BrowsableAPIRenderer',  #   API   
            )
        }
2 보기

#       
APIView
GenericAPIView
2.1 APIView 기반 인터페이스

#### views.py
from rest_framework.generics import GenericAPIView
from app01.models import Book
from app01.ser import BookSerializer
#   APIView  
class BookView(APIView):
    def get(self,request):
        book_list=Book.objects.all()
        book_ser=BookSerializer(book_list,many=True)

        return Response(book_ser.data)
    def post(self,request):
        book_ser = BookSerializer(data=request.data)
        if book_ser.is_valid():
            book_ser.save()
            return Response(book_ser.data)
        else:
            return Response({'status':101,'msg':'    '})


class BookDetailView(APIView):
    def get(self, request,pk):
        book = Book.objects.all().filter(pk=pk).first()
        book_ser = BookSerializer(book)
        return Response(book_ser.data)

    def put(self, request,pk):
        book = Book.objects.all().filter(pk=pk).first()
        book_ser = BookSerializer(instance=book,data=request.data)
        if book_ser.is_valid():
            book_ser.save()
            return Response(book_ser.data)
        else:
            return Response({'status': 101, 'msg': '    '})

    def delete(self,request,pk):
        ret=Book.objects.filter(pk=pk).delete()
        return Response({'status': 100, 'msg': '    '})
    
#models.py
class Book(models.Model):
    name=models.CharField(max_length=32)
    price=models.DecimalField(max_digits=5,decimal_places=2)
    publish=models.CharField(max_length=32)
#ser.py
class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model=Book
        fields='__all__'
# urls.py
path('books/', views.BookView.as_view()),
re_path('books/(?P<pk>\d+)', views.BookDetailView.as_view()),
2.2 Generic APIView 기반 인터페이스

# views.py
class Book2View(GenericAPIView):
    #queryset  queryset  ,        
    # serializer_class                
    queryset=Book.objects
    # queryset=Book.objects.all()
    serializer_class = BookSerializer
    def get(self,request):
        book_list=self.get_queryset()
        book_ser=self.get_serializer(book_list,many=True)

        return Response(book_ser.data)
    def post(self,request):
        book_ser = self.get_serializer(data=request.data)
        if book_ser.is_valid():
            book_ser.save()
            return Response(book_ser.data)
        else:
            return Response({'status':101,'msg':'    '})


class Book2DetailView(GenericAPIView):
    queryset = Book.objects
    serializer_class = BookSerializer
    def get(self, request,pk):
        book = self.get_object()
        book_ser = self.get_serializer(book)
        return Response(book_ser.data)

    def put(self, request,pk):
        book = self.get_object()
        book_ser = self.get_serializer(instance=book,data=request.data)
        if book_ser.is_valid():
            book_ser.save()
            return Response(book_ser.data)
        else:
            return Response({'status': 101, 'msg': '    '})

    def delete(self,request,pk):
        ret=self.get_object().delete()
        return Response({'status': 100, 'msg': '    '})
    
 #url.py
    #   GenericAPIView   
    path('books2/', views.Book2View.as_view()),
    re_path('books2/(?P<pk>\d+)', views.Book2DetailView.as_view()),
2.3 제 네 릭 APIView 와 5 개의 보기 확장 클래스 를 기반 으로 한 인터페이스

from rest_framework.mixins import  ListModelMixin,CreateModelMixin,UpdateModelMixin,DestroyModelMixin,RetrieveModelMixin
# views.py
class Book3View(GenericAPIView,ListModelMixin,CreateModelMixin):

    queryset=Book.objects
    serializer_class = BookSerializer
    def get(self,request):
        return self.list(request)

    def post(self,request):
        return self.create(request)

class Book3DetailView(GenericAPIView,RetrieveModelMixin,DestroyModelMixin,UpdateModelMixin):
    queryset = Book.objects
    serializer_class = BookSerializer
    def get(self, request,pk):
        return self.retrieve(request,pk)

    def put(self, request,pk):
        return self.update(request,pk)

    def delete(self,request,pk):
        return self.destroy(request,pk)
# urls.py
    #   GenericAPIView+5            
    path('books3/', views.Book3View.as_view()),
    re_path('books3/(?P<pk>\d+)', views.Book3DetailView.as_view()),
2.4 ModelViewSet 을 사용 하여 5 개의 인 터 페 이 스 를 작성 합 니 다.

# views.py
from rest_framework.viewsets import ModelViewSet
class Book5View(ModelViewSet):  #5     ,        
    queryset = Book.objects
    serializer_class = BookSerializer
    
# urls.py
#   ModelViewSet  5   
    path('books5/', views.Book5View.as_view(actions={'get':'list','post':'create'})), #     ,  get  ,   Book5View list  
    re_path('books5/(?P<pk>\d+)', views.Book5View.as_view(actions={'get':'retrieve','put':'update','delete':'destroy'})),
2.5 소스 코드 분석 ViewSetMixin

#    as_view
#     (              ,  {'get':'list'}), get   ,    list  
for method, action in actions.items():
    #method:get
    # action:list
    handler = getattr(self, action)
    #      ,handler    list     
    setattr(self, method, handler)
    #          .get=list
    #for         .get:  list     .post:  create
2.6 ViewSetMixin 의 보기 클래스 계승

# views.py
from rest_framework.viewsets import ViewSetMixin
class Book6View(ViewSetMixin,APIView): #     APIVIew 
    def get_all_book(self,request):
        print("xxxx")
        book_list = Book.objects.all()
        book_ser = BookSerializer(book_list, many=True)
        return Response(book_ser.data)
    
# urls.py
    #  ViewSetMixin    ,         
    path('books6/', views.Book6View.as_view(actions={'get': 'get_all_book'})),
무엇이 정방 향 대리 이 고,무엇이 역방향 대리 입 니까?
정방 향 프 록 시 대상 은 클 라 이언 트 이 고,역방향 프 록 시 대상 은 서버 입 니 다.
DRF 의 요청 과 응답의 실현 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 DRF 요청 과 응답 내용 은 저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 읽 어 주시 기 바 랍 니 다.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기