Realization of Request and Response in DRF

  • 2021-11-14 06:30:56
  • OfStack

Directory 1 Requests and Responses
1.1 Request 1.2 Response 2 View2.1 Write Interface Based on APIView 2.2 Write Interface Based on GenericAPIView 2.3 Write Interface Based on GenericAPIView and 5 View Extension Classes 2.4 Write 5 Interfaces Using ModelViewSet 2.5 Source Analysis ViewSetMixin 2.6 Inheriting ViewSetMixin View Classes

1 Request and Response

1.1 Request


#  Request object 
# from rest_framework.request import Request
    def __init__(self, request, parsers=None, authenticators=None,
                 negotiator=None, parser_context=None):
        # 2 Sub-encapsulation request , will be native request As drf request Object's  _request  Attribute 
        self._request = request
    def __getattr__ ( self , item ): 
     return getattr(self._request,item)
#  Request object .data: Front end with 3 Data passed in by various coding methods can be taken out 
#  Request object ..query_params  And Django Standard request.GET Same, except for a more correct name. 

1.2 Response


#from rest_framework.response import Response
 def __init__(self, data=None, status=None,
                 template_name=None, headers=None,
                 exception=False, content_type=None):
        
#data The data you want to return, the dictionary 
#status The returned status code, which defaults to 200 , 
 -from rest_framework import status Under this path, it defines all the status codes used as constants 
#template_name  Name of rendered template (custom template), no need to know 
#headers: Response header, you can put something into the response header, that is, 1 A dictionary 
#content_type The encoding format of the response, application/json And text/html;

#  The browser responds to the browser format, postman In response to json Format, implemented by configuration (default configuration) 
# Whether it is postman Or the browser, all return json Format data 
# drf There is a default configuration file --- "First from the project's setting Find in, cannot find, adopt the default 
# drf Configuration information of, first find it from your own class -- "Project's setting Seeking in the middle --- "Find by default 
 - Local use : Valid for a view class 
        - Write the following in the view class 
        from rest_framework.renderers import JSONRenderer
        renderer_classes=[JSONRenderer,]
    - Global usage: Global view class, all requests are valid 
     - In setting.py Add the following to 
        REST_FRAMEWORK = {
            'DEFAULT_RENDERER_CLASSES': (  #  Default response rendering class 
                'rest_framework.renderers.JSONRenderer',  # json Renderer 
                'rest_framework.renderers.BrowsableAPIRenderer',  #  Browse API Renderer 
            )
        }

2 Views


#  Two view base classes 
APIView
GenericAPIView

2.1 APIView-based write interface


#### views.py
from rest_framework.generics import GenericAPIView
from app01.models import Book
from app01.ser import BookSerializer
#  Based on APIView Written 
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':' Verification failure '})


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': ' Verification failure '})

    def delete(self,request,pk):
        ret=Book.objects.filter(pk=pk).delete()
        return Response({'status': 100, 'msg': ' Delete succeeded '})
    
#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 Interface based on GenericAPIView writing


# views.py
class Book2View(GenericAPIView):
    #queryset To pass queryset Object, queried all the books 
    # serializer_class Which serialization class is used to serialize this heap of data 
    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':' Verification failure '})


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': ' Verification failure '})

    def delete(self,request,pk):
        ret=self.get_object().delete()
        return Response({'status': 100, 'msg': ' Delete succeeded '})
    
 #url.py
    #  Use GenericAPIView Rewritten 
    path('books2/', views.Book2View.as_view()),
    re_path('books2/(?P<pk>\d+)', views.Book2DetailView.as_view()),

2.3 Interface based on GenericAPIView and 5 view extension classes


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
    #  Use GenericAPIView+5  View extension classes    Rewritten 
    path('books3/', views.Book3View.as_view()),
    re_path('books3/(?P<pk>\d+)', views.Book3DetailView.as_view()),

2.4 Writing 5 Interfaces Using ModelViewSet


# views.py
from rest_framework.viewsets import ModelViewSet
class Book5View(ModelViewSet):  #5 There are all interfaces, but there is a problem with routing 
    queryset = Book.objects
    serializer_class = BookSerializer
    
# urls.py
#  Use ModelViewSet Write 5 Interface 
    path('books5/', views.Book5View.as_view(actions={'get':'list','post':'create'})), # When the path matches, it is again get Request, will execute Book5View Adj. list Method 
    re_path('books5/(?P<pk>\d+)', views.Book5View.as_view(actions={'get':'retrieve','put':'update','delete':'destroy'})),

2.5 Source Code Analysis ViewSetMixin


#  Rewritten as_view
#  Core code (so as long as the correspondence is configured in the route, such as {'get':'list'} ) , When get When the request comes, it will be executed list Method 
for method, action in actions.items():
    #method : get
    # action : list
    handler = getattr(self, action)
    # On completion of execution 1 Sentence, handler It becomes list Memory address of 
    setattr(self, method, handler)
    # On completion of execution 1 Sentence    Object .get=list
    #for Complete loop execution   Object .get: Opposite list    Object .post : Opposite create

2.6 Inheriting view classes from ViewSetMixin


# views.py
from rest_framework.viewsets import ViewSetMixin
class Book6View(ViewSetMixin,APIView): #1 Be sure to put it APIVIew Front 
    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
    # Inheritance ViewSetMixin The route can be overwritten as follows 
    path('books6/', views.Book6View.as_view(actions={'get': 'get_all_book'})),

What is a forward proxy and what is a reverse proxy

The object of the forward proxy is the client, and the object of the reverse proxy is the server


Related articles: