1. Requests

SINHOLEE·2020년 8월 27일
1

Requests

REST 기반의 웹 서비스를 다룬다면 request.POST는 잊어야 한다.

DRFRequstHttpRequest를 확장하여 request 파싱과 인증을 유연하게 만들었다.

Request parsing

: Request클래스는 form데이터를 다루던 방식과 비슷하게 그리고 유연하게 json data 또는 media types를 다루게 한다.

.data

  • request.datarequest body를 파싱한 데이터를 리턴한다.

  • non-file, file형태의 컨텐츠 모두를 다룬다.

  • HTTP method에서 POST뿐 아니라 PUT, PATCH, DELETE 등을 모두 지원한다.(django에서는 postget만 지원했다.)

  • form 데이터 뿐 아니라 JSON형태의 데이터 또한 같은방법으로 핸들링 할 수 있다.

.query_params

  • reqest.query_parmasrequest.GET 과 동의어라고 생각하자.
  • GET요청에서 동반한 쿼리 파라미터를 다룰때는, standard django가 제공하는 request.GET보다는 request.query_params를 사용하는 것을 더 권장한다. 코드의 명확성이 좋아질 것이다.
  • GET요청 뿐 아니라, POST, DELETE등 모든 HTTP method에서 사용하는 것을 권장한다.

.parsers

  • (papago 번역 그대로)APIView class 또는 @API_view decorator는 뷰의 parser_classes set 또는 DEFAULT_PARSER_CLASS 설정에 기반하여 이 속성이 Parser 인스턴스 목록으로 자동 설정되도록 보장한다.

  • 보통 사용자가 해당 메소드에 접근할 일이 없다.

    중요1: 만약 클라이언트가 잘못된 컨텐츠(역주: malformed라는데 아마 form에 맞지 않는 데이터정도로 생각하면 될 것 같다.)를 보내게 된다면. request.data에서 ParseError를 유발하고, 이는 404 Bad Request를 반환한다.

    중요2: 만약 클라이언트가 content-type을 함께 보낸다면(보통 컨텐츠타입을 json, file 등등을 설정해서 보낼텐데 그렇다면 이건 빈칸으로 놔두고 요청을 보내도 알아서 컨텐츠 타입을 분석해서 변환해 주는것인가? 이 부분은 아직 잘 모르겠다.), UnsupportedMediaType에러를 유발하고, 415 Unsupported Media Type을 반환한다.

Content negotiation

: requestcontent negotiation(자세한 내용 링크) 단계의 결과를 사용자가 선택하는 기능을 제공한다. 이는 개발자가 구현체의 스펙(원글: implement behaviour)을 정할 수 있도록 한다. 예를 들어, 미디어 타입에 따른 각각의 serialization schemes를 선택하는 식의 구현이 가능하다.

.accepted_renderer

  • 컨텐츠 협상 단계에서 선택된 renerer 인스턴스

.accepted_media_type

  • 컨텐츠 협상 단계에서 수용된 미디어 타입, string 타입의 변수이다.

Autentication

: DRF는 유연하고 각각의 request에 대한 인증(authentication)기능을 제공한다.

  • 각각의 API마다 다른 인증 정책을 사용할 수 있다.
  • 여러개의 인증 정책들을 지원한다.
  • 유저의 정보 뿐 아니라 토큰의 정보가 request를 통해 제공한다.

자세한 사항은 인증 정책 문서 참고

.user

  • request.user는 인증정책(authentication policy)에 종속되어 있지만, django.contrib.auth.models.User 인스턴스를 반환한다.
  • 만약 request가 인증이 되지 않는다면, request.userdjango.contrib.auth.models.AnonymousUser 인스턴스를 반환한다.

.auth

  • request.auth는 추가적인 인증관련 내용(authentication context)을 반환한다. 인증 정책에 종속되어 해당 인스턴스를 반환한다. 하지만 보통 인증된 요청의 토큰 인스턴스를 반환한다.
  • 만약 인증되지 않은 request거나 추가적인 인증 컨택스트가 없다면 request.auth의 기본값은 None이다.

.authenticators

  • (papago 직번역)'APIView class' 또는 '@api_view decorator'는 뷰의 'authentication_classes set'에 기반하거나 'DEFAULT_AUTHENTICATES' 설정에 기반하여 이 속성이 자동으로 인증 인스턴스 목록으로 설정되도록 보장한다.

Browser Enhancements

: 브라우저 기반의 PUT, PATCH, DELETE forms를 지원한다.

.method

  • request.method는 대문자 stirng으로 HTTP method를 표현한다.
  • 브라우저 기반의 PUT, PATCH, DELETE forms를 지원한다.(그렇다면 HTTP method 방식과 browser-based방식이 다른건가?)

.content_type

  • request.content_typerequest bpdymedia typestring 타입으로 표현한다.
  • 만약 no media type이라면 빈 스트링을 반환한다.
  • rest framework의 기본 리퀘스트를 파싱하는 과정에서는 해당 프로퍼티에 접근할 이유가 없다.
  • 만약 정말로 컨텐츠 타입 프로퍼티에 접근해야한다면 직접 호출 말고, request.META.get('HTTP_CONTENT_TYPE')으로 호출하라.
  • 그 이유는 브라우저 기반의 비 규격 컨텐츠를 명확하게 지원하기 때문이다(원문: as it provides transparent support for browser-based non-form content.)

.stream

  • request.streamrequest body의 스트림을 가리킨다.

  • You won't typically need to directly access the request's content, as you'll normally rely on REST framework's default request parsing behavior. 즉 너가 쓸일 없어.

Standard HttpRequest attributues

  • DRFRequest 클래스는 기본 장고의 HttpRequest 클래스를 확장한 것이다. 다른 모든 변수나 메소드 또한 사용 가능하다. 예를들어, request.METArequest.session등 기존의 기능을 여전히 사용할 수 있다.
  • 구현상의 이슈로 상속이 아니라 컴포지션을 이용한 확장이라는 점을 유의하길 바란다.

profile
엔지니어로 거듭나기

0개의 댓글