나머지 프레임 워크 파서

파서 액션 :

  선택에 따라 대응하는 요청 본문 컨텐츠 요청 콘텐츠 타입 헤더 파서 처리.

  거기 애플리케이션 / JSON, x-www-form-urlencoded를, 폼 데이터 형식 

   를 urlencoded : 포맷 본체 부재는 : 나이 이름 = LQZ = 18이다 및 부인 = liuyifei 
FormData : 본체 부분과 데이터 부분의 파일 형식으로는 구별이 형성되는
JSON 형식 : 본문 JSON 형식이 몸

 

두 글로벌 사용 파서 :

settings.py에서

REST_FRAMEWORK = {
     ' DEFAULT_PARSER_CLASSES ' :
         ' rest_framework.parsers.JSONParser ' 

' rest_framework.parsers.FormParser '

' rest_framework.parsers.MultiPartParser ' ] }

보기 층 :

에서 rest_framework.views 오기 APIView은
 에서 rest_framework.response 오기 응답 

클래스 그리고 TestView (APIView)
     DEF POST (자체, 요청 * 인수, ** : kwargs로)
         인쇄 (request.content_type) 

        #의 JSONParser 값 취득 요구 및 사용이 대응 처리 
        프린트 (request.data)
         #의 파일 어플리케이션 / 시간 x-www-form-urlencoded로 또는 다중 / 폼 데이터 request.POST는 가치가 
        인쇄 (request.POST의)
         인쇄 (request.FILES)
         돌아가 반응 ( " 포스트 요청, 응답 콘텐츠 ' ) 

    DEFPUT (자체, 요청, * 인수, ** kwargs로)
         돌아 응답 ( ' 풋 요청, 응답 내용을 ' )

파서 세 부품을 사용하여

는 AS만을 먼저 요청 본체 처리 요구 내용 유형 애플리케이션 / JSON

 rest_framework.views 오기 APIView
 에서 rest_framework.response 오기 응답
 에서 rest_framework.request 오기 요청
 에서 rest_framework.parsers 오기 JSONParser의 


클래스 그리고 TestView (APIView) 


    parser_classes = [JSONParser,] 


    DEF POST (자체, 요청 인수 *, ** kwargs로) :
         인쇄 (request.content_type)의 

        #은 요구 값을 취득하고, 대응 처리에 사용 JSONParser 
        인쇄 (request.data) 

        #을 할 때 애플리케이션 / X-WWW-형상 - 를 urlencoded 또는 다중 / 폼 데이터 request.POST에서만 값
        인쇄 (request.POST의)
         인쇄 (request.FILES) 

        리턴 (응답 ' , 응답 내용을 POST 요청 ' ) 

    DEF (자체, 요청, * 인수, ** PUT kwargs로를)
         반환 응답 ( ' 풋 요청, 응답 내용을 ' )

애플리케이션 요청 헤더 요청 본문 콘텐츠 타입 /의 x-www-form-urlencoded를

에서 rest_framework.views의 수입 APIView
 에서 rest_framework.response의 수입 응답
 에서 rest_framework.request 반입 요청
 에서 rest_framework.parsers 가져 FormParser의 


클래스 를 TestView (APIView를) 

parser_classes
= [FormParser,]
DEF 포스트 (자기, 요구, 인수 *, ** kwargs로) : 인쇄 (request.content_type)
요청 본문의 다중 / 폼 데이터 요청 헤더 콘텐츠 유형
에서 rest_framework.views의 수입 APIView
 에서 rest_framework.response의 수입 응답
 에서 rest_framework.request 반입 요청
 에서 rest_framework.parsers 가져 MultiPartParser의 


클래스 를 TestView (APIView를) 


    parser_classes = [MultiPartParser,] 



    DEF 포스트 (자기, 요구, 인수 *, ** kwargs로) :
         인쇄 (request.content_type)

파일 업로드 :

에서 rest_framework.views의 수입 APIView
 에서 rest_framework.response의 수입 응답
 에서 rest_framework.request 반입 요청
 에서 rest_framework.parsers 가져 FileUploadParser의 


클래스 를 TestView (APIView를) 

parser_classes
= FileUploadParser,]

동시에 더 파서에서

다중 분석기를 사용하는 경우, 상기 요청에 따라 나머지 프레임 워크는 자동 콘텐츠 타입 헤더와 비교하여 해당 분석기를 사용

에서 rest_framework.views의 수입 APIView
 에서 rest_framework.response의 수입 응답
 에서 rest_framework.request 반입 요청
 에서 rest_framework.parsers 가져 JSONParser, FormParser, MultiPartParser의 


클래스 : 그리고 TestView (APIView) 

parser_classes
= [JSONParser, FormParser, MultiPartParser,]

DEF 포스트 (자기, 요청 * 인수, ** kwargs로) : 인쇄 (request.content_type)

네 소스 코드 분석 :

1 따라서 시작, 구문 분석하기 전에, request.data를 호출 할 때 
    @Property 
    DEF 데이터 (셀프) :
         IF  하지 (자체, _hasattr ' _full_data ' ) : 
            self._load_data_and_files () 
        반환 self._full_data
        
 2보기 self._load_data_and_files을 () 방법 ----> self._data, self._files = self._parse () 

        DEF (자체)를 _parse :
             # CONTENT_TYPE에 앞서 사용자가 요청한 값 
            MEDIA_TYPE = self.content_type의 

            #의 self.parsers는 [FileUploadParser의 유저 구성 parser_classes =이고 , FormParser] 
            #에 있을 CONTENT_TYPE자가이 함수에 전달 
            파서 =self.negotiator.select_parser (자체, self.parsers)

 3 보기 self.negotiator.select_parser (자체, self.parsers)
      DEF의 select_parser (자체, 요청, 파서) :
         # MEDIA_TYPE 및 request.content_type 비교 이상으로, 파서는 돌아갑니다 다음, 파서 분석법 전화 
        # 각 리졸버 = '다중 / 폼 데이터 MEDIA_TYPE있다 " 속성 
        에 대한 구문 분석기 에서 : 파서
             IF : media_type_matches (parser.media_type, request.content_type)
                 복귀 파서
         복귀 없음
    
 . 4 결국 파서를 호출 분석법은 분석 해결할 = parser.parse (스트림 MEDIA_TYPE, self.parser_context)
1 개 요청实例化, 파서 =의 self.get_parsers () 
    요청 ( 
                요청 
                파서 =의 self.get_parsers (), 
                인증 자 =의 self.get_authenticators () 
                협상 = , self.get_content_negotiator () 
                parser_context = parser_context 
            )
 2 get_parsers方法,循环实例化出self.parser_classes中类对象
     DEF get_parsers (자기)
          [파서 () 를위한 파서 에서 self.parser_classes]            

 3self.parser_classes 안으로 즉 APIVIew를 찾기 위해 상위를 찾을 수없는 클래스 자체를 찾는 시작 
    parser_classes =의 api_settings.DEFAULT_PARSER_CLASSES
 . 4 api_settings 개체 인 개체는 DEFAULT_PARSER_CLASSES 특성을 찾지 못 하였다, 방법 getattr하는 것
         DEF의  __getattr__을 (자기를 ATTR) :
             IF ATTR 되지 않음  self.defaults :
                 들기 AttributeError ( " : '% 1'S '는 API 설정 잘못된 " %의 ATTR) 

            은 try :
                 #의 호출 self.user_settings 방법은 사전을 반환을 사전 다음 걸릴 속성은 ATTR 
                발 = self.user_settings을 [ATTR]
             제외 KeyError를 :
                # 기본값으로 위로 하강 
                브로 = self.defaults [ATTR] 

            #에 강제 변환 오기 스트링 클래스로 
            IF ATTR self.import_strings : 
                브로 = perform_import (브로, ATTR) 

            #의 캐시 상기 결과 
            self._cached_attrs.add (ATTR) 
            않은 setattr (자기, ATTR, 발)을 
            반환 발은
  5 user_settings 방법, REST_FRAMEWORK 속성을 찾기 위해 구성 파일을 설정하여 반영, 찾을 빈 사전 반환 할 수 
    @Property 
    DEF의 :) user_settings (자기를
         경우  하지 으로 hasattr (자체, ' _user_settings을 ' ) :
            self._user_settings = getattr (설정, ' REST_FRAMEWORK ' , {})
         반환 self._user_settings
소스 과정 : 
- 통화 request.data이 분석 방법을 수행 할 때 ---- "파서 객체 파서에게 완전한 분석 방법을 호출 건너 인코딩에 따라 파서 개체를 선택

추천

출처www.cnblogs.com/HUIWANG/p/11138662.html