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):
...
...