DRF-YASG API 문서 자동화 작성 part.2

장태순
8 min readJun 17, 2021

--

지난 글에 기본 세팅까지 마쳤고 이제 실제적으로 API 작성에 따른 drf-yasg에 어떻게 적용하는지 알아보자

기본적인 drf-yasg의 스웨거 api 문서 ui

API생성

  1. GET METHOD
    이 경우에는 swagger 상에서 쿼리 스트링을 설정하여 테스트 할 수 있다.
    아래 예제 코드는 ListModelMixin Viewset으로 만든 간단한 get method api이다.

@swagger_auto_schema 데코레이터를 통해 각 엔드포인트의 메서드에 붙여주면 된다. 추가적으로 설정한 것들은

  • operation_summary가 스웨거 ui상 제목이 되고
  • opeartion_description이 설명란
  • tags는 스웨거 ui상 API를 분류하는 카테고리의 일종이고
  • manual_parameters — 이 부분이 가장 중요한 부분으로 get method에서 프론트단에서 검색조건이 설정되는 경우 혹은 변수에 의해 로직이 구성될 때 파라미터를 보내는 코드로 query_string의 형태로 url를 호출하도록 하는 기능이다.

추가적으로 response는 API상의 response를 그대로 표현하지만 커스텀하려면 swagger_auto_schema에 따로 설정해야 한다. GET의 경우 보통 list 표현인 경우가 많으므로 response도 Serializer의 형태를 그대로 따라가게 된다.

이렇게 설정하면 아래의 화면으로 나타난다.

2. POST/PUT/PATCH/DELETE METHOD
이 경우에는 swagger 상에서 body- payload를 설정하여 테스트 할 수 있다.
아래 예제코드는 CreateModelMixin Viewset을 통해 구현한 간단한 post 엔드포인트다.

GET 메소드 방법과 크게 다르지 않다. 다만 swagger_auto_schema의 설정 부분이 바뀌었다.

  • request_body — post 메소드로 body payload를 보내는 부분으로 post 메소드에서 가장 중요한 부분이다. 따로 payload를 보낼 필요가 없는 api일 경우 request_body = no_body로 선언하면 payload가 ui상에서 나타나지 않는다.

POST의 경우 API가 list를 표현하지 않고 CRD의 행태를 취한다면 response도 message 형태로 띄우는 경우가 많다. 이럴 경우 공통으로 api단에서 response 클래스를 만들어서 그대로 사용하지만 이 API에서만 따로 사용해야 한다면 swagger_auto_schem에 response를 따로 설정해야한다.

설정하면 아래의 화면으로 나타난다.

swagger_auto_schema 데코레이터 설정 params

  • method — 해당 메소드에서 매핑되는 http method가 하나만 존재할 때
  • methods — 해당 메소드에서 매핑되는 http method가 둘이상 존재할때
    ex) 함수형 view에서 api_view 데코레이터에서 as_view()가 여러개 존재하는 경우
  • auto_schema — default는 drf-yasg 패키지상의DEFAULT_AUTO_SCHEMA_CLASS를 사용한다.
  • request_body — request의 body payload이다. json형태의 값
  • query_serializer — 쿼리 구문 분석을 위해 serializer 사용하는 경우
  • operation_id — 유니크한 작업_id
  • operation_description — 제목과 Parameters 사이에 설명
  • operation_summary — API 제목
  • security -특별한 인증방법을 쓰는 경우 설정
  • deprecated — API중단여부
  • responses — default는 API상의 response와 바라보는 models의 serializer를 따라감, 스웨거 상에서 커스텀한 response가 있을 시 설정
  • field_inspectors — default : drf_yasg.inspectors.FieldInspector
  • filter_inspectors — default : drf_yasg.inspectors.FilterInspector
  • paginator_inspectors — default : drf_yasg.inspectors.PaginatorInspector
  • tags — 스웨거 ui상의 API 카테고리
  • **extra_overrides

manual_parameters

from drf_yasg.openapi import Parameter

Parameter를 상속 받아서 작성하는 부분으로 GET Method에서 query_string으로 검색조건을 보내기 위해 자주 이용된다.

Parameter("title", IN_QUERY, type=TYPE_STRING, description="제목"),
  • param str name: parameter name
  • param str in_: parameter location
  • param str description: parameter description
  • param bool required: whether the parameter is required for the operation
  • param schema: required if `in_` is ``body``
  • type schema: Schema or SchemaRef
TYPE_OBJECT = "object"  #:
TYPE_STRING = "string" #:
TYPE_NUMBER = "number" #:
TYPE_INTEGER = "integer" #:
TYPE_BOOLEAN = "boolean" #:
TYPE_ARRAY = "array" #:
TYPE_FILE = "file" #:
  • param str type: parameter type; required if `in_` is not ``body``; must not be ``object``
  • param str format: value format
# officially supported by Swagger 2.0 spec
FORMAT_DATE = "date" #:
FORMAT_DATETIME = "date-time" #:
FORMAT_PASSWORD = "password" #:
FORMAT_BINARY = "binary" #:
FORMAT_BASE64 = "bytes" #:
FORMAT_FLOAT = "float" #:
FORMAT_DOUBLE = "double" #:
FORMAT_INT32 = "int32" #:
FORMAT_INT64 = "int64" #:
# defined in JSON-schema
FORMAT_EMAIL = "email" #:
FORMAT_IPV4 = "ipv4" #:
FORMAT_IPV6 = "ipv6" #:
FORMAT_URI = "uri" #:
# pulled out of my ass
FORMAT_UUID = "uuid" #:
FORMAT_SLUG = "slug" #:
FORMAT_DECIMAL = "decimal"
  • param list enum: restrict possible values
  • param str pattern: pattern if type is ``string``
  • param .Items items: only valid if `type` is ``array``
  • param default: default value if the parameter is not provided; must conform to parameter type

--

--