web-dev-qa-db-fra.com

Django REST Cadre Swagger 2.0

Vous avez du mal à configurer Swagger UIVoici la documentation très explicative: https://Django-rest-swagger.readthedocs.io/en/latest/

Les docstrings YAML sont obsolètes. Est-ce que quelqu'un sait comment configurer l'interface utilisateur Swagger à partir du code python? ou quel fichier dois-je modifier pour regrouper les points de terminaison api, ajouter des commentaires à chaque point de terminaison, ajouter des champs de paramètres de requête dans l'interface utilisateur Swagger?

18
Teodor Scorpan

Voici 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 dictionnaire de données pour ajouter une description, des champs de requête et pour mettre à jour le type ou les fonctionnalités 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

update pour Django-rest-swagger (2.0.7): ne remplace que 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 la spécification swagger pour créer des données personnalisées.

9
bitnik

Donc, il semble que Django-rest-frameowrk ait ajouté le nouveau SchemeGenerator , mais il est à moitié cuit et manque la possibilité de générer des descriptions d’action à partir de la documentation du code, et a un problème open , dû dans 3.5.0.

Pendant ce temps, Django-rest-swagger a poursuivi et a mis à jour son code pour qu'il fonctionne avec le nouveau SchemaGenerator, ce qui en fait un changement rupture pour le moment.

Une série d’événements très étranges a conduit à ceci): en espérant que cela soit résolu bientôt. pour l'instant, la réponse proposée est la seule option.

7
Daniel Dubovski

Comme je ne pouvais trouver aucune 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éé la vue swagger:

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 dans 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
Lucianovici

Utiliser la solution proposée est un peu compliqué mais fonctionne bien, on peut rencontrer peu de problèmes pour mettre en œuvre la solution proposée mais ce document explique l’intégration de Django reste swagger 2 ainsi que les problèmes qui se posent progressivement: Django Rest Swagger 2 complet Documentation

Beaucoup de retard, mais cela peut aider quelqu'un qui cherche de l'aide maintenant.

0
M Haziq