Задать вопрос
@to_east

Как подключить документацию к SwaggerUI?

Всем привет!

Интеграция SwaggerUI в DRF прошла успешно, то есть выводятся ендпоинты в интерфейсе сваггера, но они пустые. Возможно ли подключить схему в формате json или yaml, чтобы в интерфейсе выводились, возможные параметры и возвращаемые значения?
  • Вопрос задан
  • 808 просмотров
Подписаться 2 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@to_east Автор вопроса
Пришлось немного повозится чтобы получить, то чего я хотел изначально.
В процессе поиска решения, мне стало известно, что 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
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы