Как правильно создать настроенную схему Swagger в Django Rest Framework?

У меня возникают проблемы при создании настраиваемой схемы swagger в Django Rest Framework. Я прочитал страницы документации, но не нашел четкого примера того, как генерировать аннотации в Swagger в Python.

Мне известно, что документация по swagger / schema легко генерируется при использовании ViewSets в Django. Однако я использую только APIViews и хочу написать собственную схему. Я пытался создать схему CoreAPI, но не знаю, как ее реализовать. Я прилагаю некоторые из моего примера кода, а также некоторые снимки экрана. Снимки экрана идут от того, что я имею к тому, что я хочу.

Образец кода:

urls.py

from django.conf.urls import url, include
from rest_framework.urlpatterns import format_suffix_patterns
from Views import SampleView as sv
from rest_framework_swagger.views import get_swagger_view
from rest_framework.documentation import include_docs_urls
from rest_framework.renderers import CoreJSONRenderer
from rest_framework.schemas import get_schema_view

schema_view enter code here= get_swagger_view(
    title='Sample API')

urlpatterns = [
    url(r'^sample/$', pv.SampleList.as_view()),
    url(r'^sample/(?P<id>[a-f\d]{24})/$', sv.SampleDetail.as_view()),
    url('^schema/$', schema_view),
]

urlpatterns = format_suffix_patterns(urlpatterns)

views.py

from rest_framework.views import APIView
from Manager.SampleManager import SampleManager as sm

_sampleManager = sm()

class SampleList(APIView):
"""
get:
Return a list of all the existing samples.

post:
Create a new sample.
"""
def get(self, request, format=None):

    return _sampleManager.getAll()


def post(self, request,  format=None):

    return _sampleManager.create( request)


 class SampleDetail(APIView):
   """
   get:
   Get a sample.

   put:
   Update a sample.

   delete:
   Delete a sample.
   """
def get(self, request, id, format =None):
    return _sampleManager.getById( id)

def put(self, request, id, format =None):

    return _sampleManager.update( request, id)

def delete(self, request, id, format =None):

    return _sampleManager.deleteById( id)

Searlizers.py

from rest_framework_mongoengine.serializers import DocumentSerializer
from .modles import Sample, SampleInner
from Serializers.SampleInnerSerializer import SampleInnerSerializer

class SampleSerializer(DocumentSerializer):
    other = SampleInnerSerializer(many=True)
    class Meta:
        model = Sample
        fields = '__all__'

    def create(self, validated_data):
        samples = validated_data.pop('other')
        created_instance = super(SampleSerializer,     self).create(validated_data)

        for sample_data in samples:
            created_instance.other.append(SampleInner(**sample_data))

        created_instance.save()
        return created_instance

    def update(self, instance, validated_data):
        samples = validated_data.pop('other')
        updated_instance = super(SampleSerializer, self).update(instance, validated_data)

        for sample_data in samples:
            updated_instance.other.append(SampleInner(**sample_data))

        updated_instance.save()
    return updated_instance

Schema.py

import coreapi
from rest_framework.decorators import api_view, renderer_classes
from rest_framework import renderers, response

schema = coreapi.Document(
 title='Sample API',
 content={
     'sample': coreapi.Link(
         url='/sample/',
         action='post',
         fields=[
             coreapi.Field(
                name='from',
                required=True,
                location='query',
                description='City name or airport code.'
            ),
            coreapi.Field(
                name='to',
                required=True,
                location='query',
                description='City name or airport code.'
            ),
            coreapi.Field(
                name='date',
                required=True,
                location='query',
                description='Flight date in "YYYY-MM-DD" format.'
            )
        ],
        description='Create partner'
    )
   }
 )

@api_view()
@renderer_classes([renderers.CoreJSONRenderer])
def schema_view(request):
    return response.Response(schema)

1 ответ

В этом сценарии для вас есть два решения: одно «использовать GenricApiView», два «создать пользовательскую схему строк», давайте выберем -- > первое решение.

urls.py

      schema_view = get_swagger_view(title='Test All API')
urlpatterns = [
 
   path('swagger2/', schema_view),
]

view.py

      class LoginAPIView(generics.GenericAPIView):
    serializer_class = LoginSerializer
    permission_classes = [permissions.AllowAny]

    def post(self, request):

        serializer = self.serializer_class(data=request.data)
        serializer.is_valid(raise_exception=True)
        return Response(serializer.data, status=status.HTTP_200_OK)

Результат

--> Решение второе:

Конфигурация urls.py такая же, как и раньше

просмотры.py

      class BlacklistTokenAdding(APIView):
    permission_classes = [permissions.AllowAny]

    schema = ManualSchema(fields=[
        coreapi.Field(
            "first_field",
            required=True,
            location="body",
            schema=coreschema.String()
        ),
        coreapi.Field(
            "second_field",
            required=True,
            location="body",
            schema=coreschema.String()
        ),
    ])

    def post(self, request, format='json'):
        try:
            refresh_token = request.data["refresh_token"]
            token = RefreshToken(refresh_token)
            token.blacklist()
            return Response(status=status.HTTP_200_OK)
        except Exception as e:
            return Response(status=status.HTTP_400_BAD_REQUEST)

//Обратите внимание, что first_field и second_field предназначены для демонстрации, вы можете добавить сюда столько полей, сколько хотите. Результат

Другие вопросы по тегам