framework - swagger example django
¿Cómo generar la lista de mensajes de respuesta en Django REST Swagger? (1)
Actualicé Django REST Framework a 3.5.0 ayer porque necesito una buena generación de esquemas.
Estoy utilizando Django REST Swagger para documentar mi API pero no sé cómo enumerar todos los mensajes de respuesta posibles que proporciona un punto final de API.
Parece que hay un mensaje de generación de éxito automático correspondiente a la acción que está realizando mi punto final.
Así que las acciones POST generan 201 códigos de respuesta, sin ninguna descripción.
¿Cómo puedo agregar todos los mensajes de respuesta que proporciona mi punto final y darles algunas descripciones?
estoy usando
djangorestframework==3.5.0
django-rest-swagger==2.0.7
Ah, finalmente lo tengo.
¡Pero! Esto es piratear, y probablemente no admita eso; Básicamente, el problema no está conectado al código swf de drf y drf, en lugar del códec openapi, contáctese:
def _get_responses(link):
"""
Returns minimally acceptable responses object based
on action / method type.
"""
template = {''description'': ''''}
if link.action.lower() == ''post'':
return {''201'': template}
if link.action.lower() == ''delete'':
return {''204'': template}
return {''200'': template}
El código anterior se puede encontrar en: openapi_codec/encode.py
- github Esto no está conectado de ninguna manera con drf o drf swagger - solo para cada enlace (por ejemplo: GET / api / v1 / test /) crea una plantilla con vacío descripción.
Por supuesto que hay una posibilidad de superar este problema. Pero como dije, esto es hackear hackear. Compartiré un ejemplo contigo:
docs_swagger.views.py
from rest_framework import exceptions
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
from docs_swagger.schema_generator import CustomSchemaGenerator
def get_swagger_view(title=None, url=None):
"""
Returns schema view which renders Swagger/OpenAPI.
(Replace with DRF get_schema_view shortcut in 3.5)
"""
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 = CustomSchemaGenerator(title=title, url=url) # this is altered line
schema = generator.get_schema(request=request)
if not schema:
raise exceptions.ValidationError(
''The schema generator did not return a schema Document''
)
return Response(schema)
return SwaggerSchemaView.as_view()
Lo que hago en el CustomSchemaGenerator es el siguiente:
docs_swagger.schema_generator.py
import urlparse
import coreapi
from rest_framework.schemas import SchemaGenerator
from openapi_codec import encode
def _custom_get_responses(link):
detail = False
if ''{id}'' in link.url:
detail = True
return link._responses_docs.get(
''{}_{}''.format(link.action, ''list'' if not detail else ''detail''),
link._responses_docs
)
# Very nasty; Monkey patching;
encode._get_responses = _custom_get_responses
class CustomSchemaGenerator(SchemaGenerator):
def get_link(self, path, method, view):
"""
Return a `coreapi.Link` instance for the given endpoint.
"""
fields = self.get_path_fields(path, method, view)
fields += self.get_serializer_fields(path, method, view)
fields += self.get_pagination_fields(path, method, view)
fields += self.get_filter_fields(path, method, view)
if fields and any([field.location in (''form'', ''body'') for field in fields]):
encoding = self.get_encoding(path, method, view)
else:
encoding = None
description = self.get_description(path, method, view)
if self.url and path.startswith(''/''):
path = path[1:]
# CUSTOM
data_link = coreapi.Link(
url=urlparse.urljoin(self.url, path),
action=method.lower(),
encoding=encoding,
fields=fields,
description=description
)
data_link._responses_docs = self.get_response_docs(path, method, view)
return data_link
def get_response_docs(self, path, method, view):
return view.responses_docs if hasattr(view, ''responses_docs'') else {''200'': {
''description'': ''No response docs definition found.''}
}
Y finalmente:
mi_vista.py
class TestViewSet(viewsets.ModelViewSet):
queryset = Test.objects.all()
serializer_class = TestSerializer
responses_docs = {
''get_list'': {
''200'': {
''description'': ''Return the list of the Test objects.'',
''schema'': {
''type'': ''array'',
''items'': {
''type'': ''object'',
''properties'': {
''id'': {
''type'': ''integer''
}
}
}
}
},
''404'': {
''description'': ''Not found'',
''schema'': {
''type'': ''object'',
''properties'': {
''message'': {
''type'': ''string''
}
}
},
''example'': {
''message'': ''Not found.''
}
}
},
''get_detail'': {
''200'': {
''description'': ''Return single Test object.'',
''schema'': {
''type'': ''object'',
''properties'': {
''id'': {
''type'': ''integer''
}
}
}
},
''404'': {
''description'': ''Not found.'',
''schema'': {
''type'': ''object'',
''properties'': {
''message'': {
''type'': ''string''
}
}
},
''example'': {
''message'': ''Not found.''
}
}
}
}
Considero que esto es más divertido que una solución real. La solución real es probablemente imposible de lograr en el estado actual. Tal vez debería preguntar a los creadores de drf swagger: ¿tienen planes para respaldar las respuestas?
De todos modos, la interfaz de usuario swagger:
Feliz codificacion :)