yasg framework drf django django-rest-framework swagger-ui swagger-2.0 openapi

django - framework - drf-yasg



Django REST Framework Swagger 2.0 (4)

Así es como logré hacerlo:

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. En MyOpenAPIRenderer actualizo el dictamen de datos para agregar descripción, campos de consulta y actualizar el tipo o las funciones requeridas.

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

actualización para django-rest-swagger (2.0.7) : reemplaza solo add_customizations con get_customizations .

vistas.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

Puedes leer la especificación de swagger para crear datos personalizados.

Dificultades para configurar la UI de Swagger Aquí están los documentos explicativos: https://django-rest-swagger.readthedocs.io/en/latest/

Las cadenas de documentación de YAML están en desuso. ¿Alguien sabe cómo configurar Swagger UI desde el código de Python? o ¿qué archivo debo cambiar para agrupar puntos finales de API, para agregar comentarios a cada punto final, para agregar campos de parámetros de consulta en la interfaz de usuario de Swagger?


Como no pude encontrar ninguna opción viable here , simplemente creé mi propio SchemaGenerator, así:

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

Creó la vista arrogante:

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)

Utilice esta vista en urls.py:

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

Agregue un campo personalizado dentro de 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'')


El uso de la solución propuesta es un poco intrincado pero funciona bien, uno puede enfrentar algunos problemas al implementar la solución propuesta, pero este documento explica la integración de django rest swagger 2, así como los problemas que se presentan paso a paso: documentación completa de Django Rest Swagger 2

Mucho tarde, pero puede ayudar a alguien que busca ayuda ahora.


Entonces, parece que lo que sucedió es que django-rest-frameowrk agregó el nuevo SchemeGenerator , pero está a medias y le falta la capacidad de generar descripciones de acciones a partir de documentos de código, y tiene un problema abierto al respecto , debido a 3.5.0.

Mientras tanto, django-rest-swagger siguió adelante y actualizó su código para trabajar con el nuevo SchemaGenerator, lo que lo convierte en un cambio importante por ahora.

Una serie de eventos muy extraños llevaron a esto): esperando que esto se resuelva pronto. Por ahora, la respuesta propuesta es la única opción.