파서 액션 :
선택에 따라 대응하는 요청 본문 컨텐츠 요청 콘텐츠 타입 헤더 파서 처리.
거기 애플리케이션 / 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이 분석 방법을 수행 할 때 ---- "파서 객체 파서에게 완전한 분석 방법을 호출 건너 인코딩에 따라 파서 개체를 선택