Django drf 요청 모듈 원본 분석
항목 주소:
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
대상 을 통 해 상하 문request
과encoding
을 추가 한 다 는 뜻 이다.두 번 째 문장 은
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
보 기 를 통 해 정지점 에 들 어가 면 다음 과 같 습 니 다.우 리 는 똑똑히 볼 수 있다.
drf
의Request
대상data
속성,query_params
속성 이 있 지만GET
속성 이 없습니다Protected Attributes
속성 이 있 는데,안에_request
속성 이 포함 되 어 있다.우 리 는
_request
이WSGIHttpRequest
대상 이라는 것 을 볼 수 있 기 때문에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")
우 리 는 데 이 터 를 제출 하 는 데 보통 세 가지 방법 이 있다 는 것 을 안다.인쇄 결과 보기
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.data
은request.data
에 대해 2 차 봉인 을 실시 했다.drf
원생request
원생request._request
의 속성 과 방법 은WSGIRequest
대상 이 직접 방문(호 환)request
요청 한 모든drf
연결 매개 변 수 는request
에서 분석 되 었 고 모든 패 킷 은drf
에서url
요청 되 었 다.query_params
의 호환성 이 가장 강하 고 프론트 에서 전송 할 수 있 는data
형식의 데 이 터 를 호 환 할 수 있다.Django(48)drf 요청 모듈 소스 분석 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 Django drf 소스 코드 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django 라우팅 계층 URLconf 작용 및 원리 해석URL 구성(URLconf)은 Django가 지원하는 웹 사이트의 디렉토리와 같습니다.그것의 본질은 URL과 이 URL을 호출할 보기 함수 사이의 맵표입니다. 위의 예제에서는 URL의 값을 캡처하고 위치 매개 변수로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.