如何在Django Rest Framework中正确创建自定义Swagger架构?

pav*_*gel 6 core-api mongoengine python-3.x swagger django-rest-framework

我在Django Rest Framework中创建可自定义的swagger模式时遇到问题.我已经阅读了文档页面,但没有找到关于如何在python中生成swagger注释的明确示例.

我知道在Django中使用ViewSets时很容易生成swagger/schema文档.但是,我只使用API​​Views并希望编写自定义架构.我尝试过创建一个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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在此输入图像描述

在此输入图像描述

在此输入图像描述

Aye*_*hik 0

在这个场景中,有两种解决方案适合您,一是“使用 GenricApiView”,二是“创建自定义行架构”,让我们继续 --> 解决方案一。

urls.py

schema_view = get_swagger_view(title='Test All API')
urlpatterns = [
 
   path('swagger2/', schema_view),
]
Run Code Online (Sandbox Code Playgroud)

视图.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)
Run Code Online (Sandbox Code Playgroud)

结果

在此输入图像描述

--> 解决方案二:

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)
Run Code Online (Sandbox Code Playgroud)

//注意第一个字段和第二个字段是为了演示,您可以在此处添加任意数量的字段。 结果

在此输入图像描述