webentwicklung-frage-antwort-db.com.de

Django REST Framework Swagger 2.0

Die Konfiguration der Swagger-Benutzeroberfläche ist schwierig. __ Hier finden Sie sehr erläuternde Dokumente: https://Django-rest-swagger.readthedocs.io/de/latest/

YAML-Dokumentzeichenfolgen sind veraltet. Kann jemand eine Swagger-Benutzeroberfläche innerhalb des Python-Codes konfigurieren? oder welche Datei sollte ich in Gruppen-API-Endpunkte ändern, um Kommentare zu jedem Endpunkt hinzuzufügen, um Abfrageparameterfelder in der Swagger-Benutzeroberfläche hinzuzufügen?

18
Teodor Scorpan

So habe ich es geschafft:

basis-URLs.py

urlpatterns = [
...
url(r'^api/', include('api.urls', namespace='api')),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
...
]

api.urls.py

urlpatterns = [
url(r'^$', schema_view, name='swagger'),
url(r'^article/(?P<pk>[0-9]+)/$', 
    ArticleDetailApiView.as_view(actions={'get': 'get_article_by_id'}), 
    name='article_detail_id'),
url(r'^article/(?P<name>.+)/(?P<pk>[0-9]+)/$', 
    ArticleDetailApiView.as_view(actions={'get': 'get_article'}), 
    name='article_detail'),
]

api.views.py. In MyOpenAPIRenderer aktualisiere ich das Datendiktat, um eine Beschreibung, Abfragefelder und den Typ oder die erforderlichen Features zu aktualisieren.

class MyOpenAPIRenderer(OpenAPIRenderer):
    def add_customizations(self, data):
        super(MyOpenAPIRenderer, self).add_customizations(data)
        data['paths']['/article/{name}/{pk}/']['get'].update(
            {'description': 'Some **description**',
             'parameters': [{'description': 'Add some description',
                             'in': 'path',
                             'name': 'pk',
                             'required': True,
                             'type': 'integer'},
                            {'description': 'Add some description',
                             'in': 'path',
                             'name': 'name',
                             'required': True,
                             'type': 'string'},
                            {'description': 'Add some description',
                             'in': 'query',
                             'name': 'a_query_param',
                             'required': True,
                             'type': 'boolean'},
                            ]
             })
        # data['paths']['/article/{pk}/']['get'].update({...})
        data['basePath'] = '/api'  

@api_view()
@renderer_classes([MyOpenAPIRenderer, SwaggerUIRenderer])
def schema_view(request):
    generator = SchemaGenerator(title='A title', urlconf='api.urls')
    schema = generator.get_schema(request=request)
    return Response(schema)


class ArticleDetailApiView(ViewSet):

    @detail_route(renderer_classes=(StaticHTMLRenderer,))
    def get_article_by_id(self, request, pk):
        pass

    @detail_route(renderer_classes=(StaticHTMLRenderer,))
    def get_article(self, request, name, pk):
        pass

update für Django-rest-swagger (2.0.7): Ersetzen Sie nur add_customizations durch get_customizations.

views.py

class MyOpenAPIRenderer(OpenAPIRenderer):
    def get_customizations(self):
        data = super(MyOpenAPIRenderer, self).get_customizations()
        data['paths'] = custom_data['paths']
        data['info'] = custom_data['info']
        data['basePath'] = custom_data['basePath']
        return data

Sie können die Swagger-Spezifikation lesen, um benutzerdefinierte Daten zu erstellen.

9
bitnik

Es scheint also so, als sei Django-rest-frameowrk fügte den neuen SchemeGenerator hinzu , aber es ist halb fertig und es fehlt die Möglichkeit, Aktionsbeschreibungen aus Code-Docs zu generieren, und haben ein offenes Problem) darüber , fällig in 3.5.0.

In der Zwischenzeit hat Django-rest-swagger den Code aktualisiert, um mit dem neuen SchemaGenerator zusammenzuarbeiten, was ihn vorerst zu einem brechenden Wechsel macht.

Sehr seltsame Ereignisse führten dazu:) Ich hoffe, dass das bald gelöst wird. Im Moment ist die vorgeschlagene Antwort die einzige Option.

7
Daniel Dubovski

Da ich keine sinnvolle Option here finden konnte, habe ich einfach meinen eigenen SchemaGenerator erstellt, wie folgt:

from rest_framework.schemas import SchemaGenerator


class MySchemaGenerator(SchemaGenerator):   
    title = 'REST API Index'

    def get_link(self, path, method, view):
        link = super(MySchemaGenerator, self).get_link(path, method, view)
        link._fields += self.get_core_fields(view)
        return link

    def get_core_fields(self, view):
        return getattr(view, 'coreapi_fields', ())

Erstellt die Swagger-Ansicht:

from rest_framework.permissions import AllowAny
from rest_framework.renderers import CoreJSONRenderer
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework_swagger import renderers


class SwaggerSchemaView(APIView):
    _ignore_model_permissions = True
    exclude_from_schema = True
    permission_classes = [AllowAny]
    renderer_classes = [
        CoreJSONRenderer,
        renderers.OpenAPIRenderer,
        renderers.SwaggerUIRenderer
    ]

    def get(self, request):
        generator = MySchemaGenerator()
        schema = generator.get_schema(request=request)

        return Response(schema)

Verwenden Sie diese Ansicht in urls.py:

url(r'^docs/$', SwaggerSchemaView.as_view()),

Fügen Sie ein benutzerdefiniertes Feld in einer APIView hinzu:

class EmailValidator(APIView):
    coreapi_fields = (
        coreapi.Field(
            name='email',
            location='query',
            required=True,
            description='Email Address to be validated',
            type='string'
        ),
    )

    def get(self, request):
        return Response('something')
7
Lucianovici

Die vorgeschlagene Lösung ist zwar etwas hackig, funktioniert aber gut. Möglicherweise gibt es einige Probleme bei der Implementierung der vorgeschlagenen Lösung. Dieses Dokument erklärt jedoch die Integration von Django rest swagger 2 sowie die Probleme, mit denen Schritt für Schritt konfrontiert wird: Django Rest Swagger 2 Dokumentation

Viel spät, aber es kann jemandem helfen, der jetzt nach Hilfe sucht.

0
M Haziq