요청 모듈 DRF
요청은 wdgi의 기초를 다시 요청 DRF 포장되어
속성 DRF의 요청으로 요청을 WSGI : _request
이전 요청에 대한 새로운 요구는 완벽하게 호환 만든
더 표준화 된 데이터 분석을위한 새로운 요청 : 모든 매개 변수가 query_params 접합에 해결 될 수는 모든 데이터 패킷의 데이터로 분석하고 있으며, 속하는 데이터가 QueryDict 유형을 query_params, .dict ()는 원시 형 DICT로 변환
소스 코드 분석
- APIView 카테고리의 DRF 다음 as_view ()를 다시 작성하지만, 주요 논리는 여전히 as_view의 부모보기 (), 로컬 장애인 CSRF 인증 전화 초점 : CSRF 인증 학교 안하고 모든 기본적인 뷰 클래스 APIView 상속 DRF보기 클래스, 테스트
APIView의 DRF 클래스 : self.initialize_request (요청, * 인수, ** kwargs로) : 내부에 캡슐화 된 보조 ruquest에 파견 ()를 오버라이드 (override)
实例: print(request) print(request._request.GET) print(request.META) print(request.META.get('HTTP_LLL'))
내부 코어 :
走drf的Request初始化方法__init__:self.request=request
drf的Request的getter方法__getattr__:先从self.request反射属性,没取到再冲drf的request中取
DRF 렌더링 모듈
데이터 뷰 클래스 (부분 일치)에서 뷰의 렌더링에 영향 속성 renderer_classes 클래스 매칭 할 수있다
데이터의 관점에서 프로젝트의 프로파일을 구성 할 수 있습니다 DRF가 구성 할 렌더링에 대한 응답을 DEFAULT_RENDERER_CLASSES (글로벌)
글로벌 구성에서 뷰 클래스, 또한 로컬 구성이있는 경우, 우선 순위는 자신의 로컬 구성을 이동
소스 코드 분석
보조 치료 응답 개체 : APIView의 디스패치 방법 -> self.finalize_response (요청, 응답, 인수 *, ** kwargs로)
클래스 객체를 렌더링하기 다음 finalize_response에 방법 -> self.perform_content_negotiation (요청, 힘 = true)를
클래스 오브젝트는 구성 파일로부터 획득 렌더링 : perform_content_negotiation -> self.get_renderers () - [self.renderer_classes 렌더러위한 렌더러 ()]>
局部:renderer_classes = [JSONRenderer,BrowsableAPIRenderer] 全局:REST_FRAMEWORK = { # 渲染模块的全局配置:开发一般只配置json 'DEFAULT_RENDERER_CLASSES': [ 'rest_framework.renderers.JSONRenderer',]
DRF 분석 모듈
서비스는 패킷 데이터를 대상으로
구성 할 수있다 (일부 구성) 상기 데이터 패킷은 뷰 클래스의보기 parser_classes 클래스 속성으로 분석
그것은 패킷의 구성에 의해 해결 될 수는 구성 파일 DRF 프로젝트에서 구성보기를 DEFAULT_PARSER_CLASSES (글로벌)
소스 코드 분석
APIView 디스패치 방법 self.initialize_request (요청 인수 *, ** kwargs로)가 데이터 분석의 내부에 구비
제공된 데이터 self.get_parsers ()를 파싱 self.get_parser_context (요청) (파싱 클래스 구성 찾고 내부에서) 해상도 클래스 객체를 제공한다
局部:parser_classes = [JSONParser, MultiPartParser, FormParser] 全局: REST_FRAMEWORK ={'DEFAULT_PARSER_CLASSES': [ 'rest_framework.parsers.JSONParser', 'rest_framework.parsers.FormParser', 'rest_framework.parsers.MultiPartParser' ]}
DRF 예외 모듈
개체 이상 이상이 정보 기록 모듈을 다시 쓰기 (라인 항목)
EXCEPTION_HANDLER DRF는 구성 설정에 배열 함수 포인트 지정 exception_handler
이상 DRF 및 exception_handler 콜백 기능, 비정상적인 특이한 내용 관련 개체, 완전한 정보 exception_handler 다른 함수가 반환 로깅 정보 및 예외 로그를 수행한다
소스 코드 분석
디스패치 APIView 방법에서, 많은 시도 ... 제외시켰다가 ..., 비정상 처리 모듈 self.handle_exception 실행 코드 예외 (EXC)
구성 프로세스 이상의 구성과 기능을 매핑 (이상 맞춤 지점 모듈은 그 기능을 지정하도록 구성된다) self.get_exception_handler ()를
공정 (클라이언트 측 예외), 시스템이 처리하지 않았다 (이상 서버)에 첫 번째 시스템, 그리고 자신의 처리 : 이상 기능 exception_handler (EXC, 컨텍스트) 예외를 처리, 그것은 자신의 갈 것이다
사용자 정의 할 필요가 있으므로, DRF 만 이상 고객과의 거래를 기록 할 예외 정보 요구 로깅, 서버는 수동 처리, 통합 치료 결과를 필요로하는
def exception_handler(exc, context): response = drf_exception_handler(exc, context) if response is None: # drf没有处理的异常(服务器异常) return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR, data={ 'status': 6, 'exc': '%s' % exc }) # 项目阶段,要记录到日志文件 return Response(status=response.status_code, data={ 'status': 7, # drf处理的客户端异常,原始处理方式是将异常信息放在response对象的data中,data的格式是{'datail': '具体的异常信息'} 'exc': '%s' % response.data.get('detail') }) 全局:REST_FRAMEWORK ={['EXCEPTION_HANDLER': 'api.utils.exception_handler']}
# DRF 응답 모듈
응답 클래스 객체가 생성 매개 변수 및 사용 응답 할 수있는 개체 클래스의 속성을 필요로
파라미터 : 반응 (= 데이터 데이터 네트워크 상태 응답 코드, 응답 상태 = 헤더 = 응답 헤더 정보 선단부을 수행하는)
属性 : response.data response.status_code의 response.status_text
핵심 소스 코드
源码:Response类的__init__方法 核心:知道response对象产生可以传那些信息,response对象又是如何访问这些信息的