DRF에서 파서(Parser)는 요청 본문을 파이썬 자료형으로 바꾸고, 렌더러(Renderer)는 응답 데이터를 클라이언트가 받을 형식으로 바꾼다. 어떤 렌더러를 쓸지는 요청의 Accept 헤더를 보고 고르는데, 이를 콘텐츠 협상(content negotiation)이라 한다.
요청 본문(JSON·폼·멀티파트) ──Parser──▶ request.data
serializer.data ──Renderer──▶ 응답 본문(JSON·HTML·…)기본값
REST_FRAMEWORK = {
"DEFAULT_PARSER_CLASSES": [
"rest_framework.parsers.JSONParser",
"rest_framework.parsers.FormParser",
"rest_framework.parsers.MultiPartParser",
],
"DEFAULT_RENDERER_CLASSES": [
"rest_framework.renderers.JSONRenderer",
"rest_framework.renderers.BrowsableAPIRenderer",
],
}- 설정하지 않으면 위와 같은 값이 쓰인다. 파서는 요청의
Content-Type으로 고른다 BrowsableAPIRenderer는 브라우저로 API를 열면 HTML 탐색 화면을 보여준다. 운영에서 JSON만 내보내려면 렌더러를JSONRenderer만 남긴다- 뷰마다
parser_classes,renderer_classes로 바꿀 수 있다. 파일 업로드 뷰는MultiPartParser, 코드 하이라이트를 HTML로 주는 뷰는StaticHTMLRenderer처럼 - URL 끝에
.json같은 포맷 접미사(format suffix)를 붙여 형식을 고르게 할 수도 있다(format_suffix_patterns)
시리얼라이저와의 경계
시리얼라이저는 "모델 ↔ 파이썬 dict"까지만 책임지고, "dict ↔ 바이트(JSON 문자열)"는 파서·렌더러가 맡는다(DRF 시리얼라이저). 그래서 같은 시리얼라이저로 JSON과 다른 형식을 모두 낼 수 있다. 관심사를 단계별로 나눈 구조라 단계 쪼개기와 닮았다.
HTTP 관점
콘텐츠 협상은 DRF만의 개념이 아니라 HTTP 표준(Accept, Content-Type)이다. 같은 URL이 형식에 따라 다른 응답을 주면 캐시가 섞이지 않게 Vary: Accept 헤더가 필요하다(브라우저 캐시). 스프링에서는 메시지 컨버터가 같은 일을 한다(Spring MVC 요청 흐름).
출처: DRF Parsers: How the parser is determined · DRF Renderers: Setting the renderers · BrowsableAPIRenderer · DRF Content negotiation