상세한 분석 모듈 DRF

요청 모듈 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对象又是如何访问这些信息的

추천

출처www.cnblogs.com/lzss/p/11922442.html