Drf_yasg swagger_auto_schema перемещение из представлений

В классах представлений моего проекта я использую декоратор swagger_auto_schema для настройки возможных ответов swagger. Мой вопрос заключается в следующем: "Есть ли способ перенести все эти декораторы из моих представлений, основанных на классах, в другое место, например в модуль или файл python?". Я задаю этот вопрос, потому что декораторы swagger_auto_schema иногда занимают большую часть кода моих представлений, и их становится трудно читать.

<
class ArticleListCreateAPIView(ListCreateAPIView):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer

    def get_serializer_class(self):
        if self.request.method == "GET":
            return ArticleResponseSerializer
        return super().get_serializer_class()
    
    @swagger_auto_schema(
        responses={
            status.HTTP_201_CREATED: openapi.Response(
                description="Successful article create",
                schema=ArticleResponseSerializer,
            ),
            status.HTTP_400_BAD_REQUEST: openapi.Response(
                description="Data serialization failed. Incorrect data.",
                schema=DetailResponseSerializer
            ),
            status.HTTP_409_CONFLICT: openapi.Response(
                description="Media-file is already bouned to some other model",
                schema=DetailResponseSerializer
            )
        }
    )
    def post(self, request, *args, **kwargs):
        ...
пример:

Может быть, мне стоит отказаться от использования swagger_auto_schema и заменить ее какими-то другими структурами?

Мое решение состоит в том, чтобы разделить части ответов, ответы и swagger_auto_schema на 3 определенных места. В корне моего проекта я создал папку utils, в которой я храню файлы следующим образом:

utils
├── __init__.py
├── ...
└── swagger
   ├── __init__.py
   ├── generators.py            <---- http/https schema for swagger
   ├── response_templates.py    <---- templates of swagger_auto_schema response parts
   └── serializers.py           <---- some general response serializers

В response_templates.py имеется следующий код:

from drf_yasg import openapi
from rest_framework import status

from .serializers import DetailResponseSerializer, TaskRequestSerializer


FILE_SUCCESS_200 = {
    status.HTTP_200_OK: openapi.Response(
        description="Correct file get",
        schema=openapi.Schema(type=openapi.TYPE_FILE),
    ),
}

TASK_CREATED_201 = {
    status.HTTP_201_CREATED: openapi.Response(
        description="Successfully task created",
        schema=TaskRequestSerializer,
    ),
}

... # and other 

Таким образом, я могу использовать эти части ответов в моем декораторе swagger_auto_schema. Следующим шагом было создание папок responses во всех приложениях, которым нужны пользовательские ответы в swagger. дерево папки responses:

responses
├── __init__.py
├── image.py
└── and_other_models_name_files.py

В image.py имеется следующий код:

from utils.swagger.response_templates import (
    TASK_CREATED_201, FILE_SUCCESS_200, CREATED_201, SERIALIZE_400, NOT_FOUND_404,
    LARGE_ENTITY_413, INVALID_FILE_FORMAT_415, SERVER_STORAGE_500
)


image_list_responses = {
    **TASK_CREATED_201,
    **SERIALIZE_400,
    **LARGE_ENTITY_413,
    **INVALID_FILE_FORMAT_415,
}

image_detail_responses = {
    **FILE_SUCCESS_200,
    **NOT_FOUND_404,
    **SERVER_STORAGE_500
}

Итак, в результате вышеуказанной реструктуризации я могу использовать вышеуказанные ответы в декораторе swagger_auto_schema. Пример:

from media_app.responses import image_detail_responses


class DetailDownloadAPIView(RetrieveDestroyAPIView):
    @swagger_auto_schema(responses=image_detail_responses)
    def get(self, request, *args, **kwargs):
        ...

...

Вернуться на верх