DRF 파서 어셈블리

16762 단어 Django프레임
파서 어셈블리
Django 기본 파서
  • from django.core.handlers.wsgi import WSGIRequest
  • POST = property(get post, set post), def 찾기load_post_and_files(self) 함수로 유형을 판단한 다음 해석 봉인을 진행합니다.콘텐츠만 지원type == ‘multipart/from-data’ .사용자 정의 봉인도 가능하지만 개방 폐쇄 원칙에 따라 원본 코드를 변경하지 마십시오.
  • class LoginView(View):
    
        def get(self, request):
            return render(request, 'login.html')
    
        def post(self, request):
            print(request.POST)
            origin_data = request.body
            parsed_data = origin_data.decode('utf-8')
            print(parsed_data)
            return HttpResponse("ok")
    

    DRF 파서
    from rest_framework.views import APIView
    from rest_framework.parsers import FormParser
    
    
    class LoginView(APIView):
        parser_classes = [FormParser]
        #           ,     formdata 
    
        def get(self, request):
            return render(request, 'login.html')
    
        def post(self, request):
            # print(request.POST)
            # origin_data = request.body
            # parsed_data = origin_data.decode('utf-8')
            # print(parsed_data)
            print(request.data)
            # request.data      ,   porperty      
            return HttpResponse("ok")
    
  • views.LoginView.as_view()
  • LoginView에는 as 가 없습니다.view 메서드, 상위 APIView 찾기
  • 실행 View 내 asview () 방법, 반환 함수
  • def view(request, *args, **kwargs):
     self = cls(**initkwargs)
        if hasattr(self, 'get') and not hasattr(self, 'head'):
            self.head = self.get
        self.request = request
        self.args = args
        self.kwargs = kwargs
        return self.dispatch()
    
  • url과 보기 함수 사이의 귀속 관계 구축 완료{"login": view}, 사용자 요청 대기
  • 사용자가 i에게 요청한 것을 받아들인다:login, 연결된 관계에서 보기 함수를 실행한다:view(request)
  • 보기 함수의 실행 구조가 무엇인지 사용자에게 되돌려줍니다:self.dispatch(),self.diaptch () 의 실행 결과가 무엇인지 사용자에게 되돌려줍니다
  • 이때의self는 LoginView 대상을 대표한다
  • 디스패치 방법을 찾기 시작했는데 self에 없고 LoginView에 없고 APIView에
  • APIView 내 dispatch 실행 시작
  • 마지막으로 http 방법(GET,POST,PUT,DELETE)을 찾아라
  • 찾은 방법(GET),self.get (), self는 LoginView의 실례화 대상
  • 을 나타냅니다.
    11.1        POST  ,   request.data
    11.2     ,         request.data    , data     (     )
    11.2     request.data
    	@property
    	def data(self):
    		if not _hasattr(self, '_full_data'):
    			self._load_data_and_files()
    		return self._full_data
    11.3   self._load_data_and_files
    11.4   self._data, self._files = self._parse()
    11.5 parser = self.negotiator.select_parser(self, self.parsers)
    	11.5.1    self.parsers
    	11.5.2 self.get_parses()
    			[ parse() for parse in self.parser_classes ]
    		11.5.3 parser_classes = api_settings.DEFAULT_PARSER_CLASSES
    		11.5.4 from rest_framework import api_settings
    		11.5.5 api_settings = APISettings(None, DEFAULTS, IMPORT_STRINGS)
    	11.5.6 class APISettings():pass
    	11.5.7    DEFAULT_PARSER_CLASSES,__getattr__
    		'DEFAULT_PARSER_CLASSES': (
    		'rest_framework.parsers.JSONParser',
    		'rest_framework.parsers.FormParser',
    		'rest_framework.parsers.MultiPartParser'
    	),
    	11.5.8       settings
    	11.5.9    rest_framework settings
    
    11.6 self._data         
    11.7 DRF self._data = data
    11.8 request.data
    

    DRF의 모든 기능은 asview () 와 디스패치에서 다시 쓴
    해상도 구성 요소는 디스패치 방법에서 다시 썼습니다. 구체적으로 다시 봉인된 Request 대상에서
    #    
    class LoginView(APIView):
    	def get(self, request):
    	    pass
    		
    	def post(self, request):
    		request.data  #   request   @property
    		return
    
    
    class APIView(View):
    	@classmethod
    	def as_view(cls, **initkwargs):
    	    pass
    		super(APIView, cls).as_view(**initkwargs)
    		
    	def initialize_request(self, request, *args, **kwargs):
    	
    		from rest_framework.request import Request
    
    		return Request(
    			request,  #   request  
    			parsers=self.get_parsers(), #
    			authenticators=self.get_authenticators(),
    			negotiator=self.get_content_negotiator(),
    			parser_context=parser_context
    		)
    			
    	def dispatch(self):
    	    pass
    		request = self.initialize_request(request, *args, **kwargs)
            self.request = request
    		
    	def get_parsers(self):
    	
    		return [parser() for parser in self.parser_classes]
    

    좋은 웹페이지 즐겨찾기