Django drf 요청 모듈 원본 분석

DRF 프레임 워 크 는 모두 Django Rest Framework 라 고 부 르 며 Django 내 장 된 모듈 의 확장 으로 표준화 RESTful API 를 만 드 는 데 사 용 됩 니 다.이 는 ORM 맵 데이터 베 이 스 를 이용 하여 직렬 화 된 데 이 터 를 사용자 정의 하여 되 돌려 줍 니 다.주로 앞 뒤 분리 항목 에 사 용 됩 니 다.
항목 주소:
https://github.com/encode/django-rest-framework
요청 모듈:request 개체
소스 코드 입구APIView유형 중dispatch방법 중의:request=self.iniialize_request(*args, **kwargs)소스 코드 는 다음 과 같다.

def initialize_request(self, request, *args, **kwargs):
    """
    Returns the initial request object.
    """
    parser_context = self.get_parser_context(request)

    return Request(
        request,
        parsers=self.get_parsers(),
        authenticators=self.get_authenticators(),
        negotiator=self.get_content_negotiator(),
        parser_context=parser_context
    )
소스 코드 분석
소스 코드 는 매우 간단 합 니 다.첫 번 째 문장parser_context = self.get_parser_context(request)에서 우 리 는 들 어 가 는 방법get_parser_context에서 소스 코드 를 봅 니 다.

"""
Returns a dict that is passed through to Parser.parse(),
as the `parser_context` keyword argument.
"""
# Note: Additionally `request` and `encoding` will also be added
#       to the context by the Request object.
return {
    'view': self,
    'args': getattr(self, 'args', ()),
    'kwargs': getattr(self, 'kwargs', {})
}
위의 코드 는Parser.parse()해석 할 수 있 도록 해 석 된 사전 을 되 돌려 주 고Request대상 을 통 해 상하 문requestencoding을 추가 한 다 는 뜻 이다.
두 번 째 문장 은Request대상 을 되 돌려 주 고 클릭 하여 보기 에 들 어 갑 니 다.

우 리 는 내부 에서request에 대해 2 차 포장 을 한 것 을 분석 할 수 있다._request은 하나의HttpRequest대상 이 고Request유형 중 에__getattr__도 있다.코드 는 다음 과 같다.

def __getattr__(self, attr):
    """
    If an attribute does not exist on this instance, then we also attempt
    to proxy it to the underlying HttpRequest object.
    """
    try:
        return getattr(self._request, attr)
    except AttributeError:
        return self.__getattribute__(attr)
이 인 스 턴 스 에 속성 이 존재 하지 않 는 다 면 우 리 는 그 대상 을 끝까지 대리 하려 고 시도 할 것 이다HttpRequest.다음은 사례 를 통 해 보 여 드릴 수 있 습 니 다.
사례 시범

우 리 는TestView보 기 를 만 들 었 습 니 다.보기 함수 에서 3 개request속성 을 인쇄 하고response에 정지점 을 쳤 습 니 다.그 다음 에url보 기 를 통 해 정지점 에 들 어가 면 다음 과 같 습 니 다.

우 리 는 똑똑히 볼 수 있다.
  • request 는drfRequest대상
  • request 아래data속성,query_params속성 이 있 지만GET속성 이 없습니다
  • 위 에 또 하나의Protected Attributes속성 이 있 는데,안에_request속성 이 포함 되 어 있다.

    우 리 는_requestWSGIHttpRequest대상 이라는 것 을 볼 수 있 기 때문에GET속성 이 있 을 수 있 습 니 다.그래서 우리 보기 에서 인쇄 한request.GET은 실제request._request.GET와 같 습 니 다.request속성 이 없 기 때문에GET중의_request속성 에 접근 할 것 입 니 다.마지막 으로 인쇄 결 과 를 살 펴 보 겠 습 니 다.다음 과 같 습 니 다.
    
    <QueryDict: {'a': ['1']}>
    <QueryDict: {'a': ['1']}>
    <QueryDict: {'a': ['1']}>
    마찬가지 로GET요청 도 마찬가지 입 니 다.보기 에POST요청 방식 을 추가 합 니 다.다음 과 같 습 니 다.
    
    def post(self, request, *args, **kwargs):
        print(request.POST)  #   
        print(request._request.POST)  #     
        print(request.data)  #   ,     ,3        
        return Response("drf post ok")
    우 리 는 데 이 터 를 제출 하 는 데 보통 세 가지 방법 이 있다 는 것 을 안다.
  • multipart/form-data
  • application/x-www-form-urlencoded
  • application/json
  • 우선 요청 데 이 터 를 제출 하고 API 를 요청 합 니 다.

    인쇄 결과 보기POST
    
    <QueryDict: {'a': ['1']}>
    <QueryDict: {'a': ['1']}>
    <QueryDict: {'a': ['1']}>
    볼 수 있 습 니 다multipart/form-data이런 요청 방식 은 모두 인쇄 할 수 있 습 니 다.
    이어서 우 리 는pycharm을 사용 하여 요청 데 이 터 를 제출 하고 API 를 요청 합 니 다.
    
    <QueryDict: {'a': ['1']}>
    <QueryDict: {'a': ['1']}>
    <QueryDict: {'a': ['1']}>
    볼 수 있 습 니 다multipart/form-data이런 요청 방식 은 모두 인쇄 할 수 있 습 니 다.
    마지막 으로 저 희 는application/x-www-form-urlencoded요청 데 이 터 를 제출 하고 API 를 요청 합 니 다.
    application/x-www-form-urlencoded이런 요청 방식 을 볼 수 있 습 니 다.application/json만 인쇄 할 수 있 습 니 다.
    
    <QueryDict: {}>
    <QueryDict: {}>
    {'a': 1}
    그래서application/json호환성 이 가장 강하 다.
    총괄request.datarequest.data에 대해 2 차 봉인 을 실시 했다.drf원생request원생request._request의 속성 과 방법 은WSGIRequest대상 이 직접 방문(호 환)request요청 한 모든drf연결 매개 변 수 는request에서 분석 되 었 고 모든 패 킷 은drf에서url요청 되 었 다.query_params의 호환성 이 가장 강하 고 프론트 에서 전송 할 수 있 는data형식의 데 이 터 를 호 환 할 수 있다.
    Django(48)drf 요청 모듈 소스 분석 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 Django drf 소스 코드 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

    좋은 웹페이지 즐겨찾기