Пришлось немного повозится чтобы получить, то чего я хотел изначально.
В процессе поиска решения, мне стало известно, что coreapi и swagger работают с разными json форматами, для конвертации формата я обратился за помощью к
https://github.com/core-api/python-openapi-codec, плюс ко всему мне удобнее описывать спеки в yaml формате.
Все привиденные файлы расположенны относительно джанго корневого проджекта:
file: api/helpers/SwaggerAPICodec.py
import yaml
from coreapi.codecs.base import BaseCodec
from coreapi.document import Document
from coreapi.exceptions import ParseError
from openapi_codec.decode import _parse_document
class SwaggerAPICodec(BaseCodec):
format = 'openapi'
media_type = 'application/openapi+yaml'
def decode(self, bytes, **options):
try:
data = yaml.safe_load(bytes)
except ValueError as exc:
raise ParseError('Malformed YAML. {}'.format(exc))
base_url = options.get('base_url')
doc = _parse_document(data, base_url)
if not isinstance(doc, Document):
raise ParseError('Top level node must be a document.')
return doc
def encode(self, document, **options):
# TODO SwaggerAPICodec.encode() freeze
raise AttributeError('.encode() method not yet developed.')
file: api/views/ApiView.py
from rest_framework.views import APIView as BaseAPIView
from rest_framework.permissions import AllowAny
from rest_framework_swagger import renderers
from rest_framework.response import Response
from api.helpers.SwaggerAPICodec import SwaggerAPICodec
class ApiView(BaseAPIView):
permission_classes = [AllowAny]
renderer_classes = [
renderers.OpenAPIRenderer,
renderers.SwaggerUIRenderer,
]
def get(self, request):
codec = SwaggerAPICodec()
bytestr = open('api/swagger.yaml', 'rb').read()
schema = codec.decode(bytestr)
return Response(schema)
file: api/urls.py
from django.urls import path
from .views.ApiView import ApiView
urlpatterns = [
path('swagger/', ApiView.as_view()),
# ...
]
Как видно файл схемы загружается локально но можно сделать и удаленно, при помощи coreapi.Client