Django REST Framework Swagger 2.0

avoir du mal à configurer Swagger UI Voici les documents très explicatifs:1-->https://django-rest-swagger.readthedocs.io/en/latest/

les cordons de YAML sont dépréciés. Quelqu'un sait-il comment configurer Swagger UI à partir du code python? ou quel fichier dois-je modifier pour grouper les paramètres de l'api, pour ajouter des commentaires à chaque paramètre, pour ajouter des champs de paramètres dans Swagger UI?

17
demandé sur Teodor Scorpan 2016-07-23 17:09:39

4 réponses

C'est comment j'ai réussi à le faire:

base 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. Dans MyOpenAPIRenderer je mets à jour le dict de données pour ajouter la description, les champs de requête et pour mettre à jour le type ou les caractéristiques requises.

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

mise à jour pour django-reste-swagger (2.0.7): remplacez add_customizations avec 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

Vous pouvez lire les spécification swagger pour créer des données personnalisées.

8
répondu bitnik 2017-03-16 08:13:35

il semble donc que ce qui s'est passé est django-rest-frameowrk ajout du Nouveau SchemeGenerator, mais il est à moitié cuit et manque la capacité de générer des descriptions d'action à partir de Docs de code, et avoir un ouvrir une question à ce sujet, en raison de 3.5.0.

pendant ce temps, django-rest-swagger a mis à jour leur code pour travailler avec le nouveau SchemaGenerator, ce qui en fait un briser le changement pour l'instant.

série d'événements très bizarres conduit à la présente ): espérons que ce sera bientôt résolue. pour l'instant, la réponse proposée est la seule option.

7
répondu Daniel Dubovski 2016-09-12 11:07:52

puisque je n'ai pas pu trouver d'option viable ici j'ai simplement créé mon propre SchemaGenerator, comme ceci:

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', ())

Créé le swagger vue:

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)

utilisez cette vue urls.py:

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

Ajouter un champ personnalisé dans un APIView:

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
répondu Lucianovici 2017-01-11 22:38:23

L'utilisation de la solution proposée est un peu hacky mais fonctionne bien, on peut faire face à peu de problèmes de mise en œuvre de la solution proposée mais ce doc explique l'intégration django rest swagger 2 ainsi que les problèmes rencontrés étape par étape: Django Reste Swagger 2 documentation complète

beaucoup plus tard, mais cela peut aider quelqu'un qui cherche de l'aide maintenant.

0
répondu M Haziq 2017-10-13 07:01:03