include_docs_urls framework example drf documentar django rest django-rest-framework django-swagger

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 :)