YAML docstring Parser in REST Swagger veraltet> = 2,0
Was ich tat, ist durch das Tool Schemaklasse außer Kraft setzen nach Ansicht der docstring durch meine eigenen Konventionen zu analysieren.
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.schemas import SchemaGenerator
from rest_framework.views import APIView
from rest_framework_swagger import renderers
import yaml
import coreapi
import urlparse
class SchemaGenerator(SchemaGenerator):
def get_link(self, path, method, view):
"""Custom the coreapi using the func.__doc__ .
if __doc__ of the function exist, use the __doc__ building the coreapi. else use the default serializer.
__doc__ in yaml format, eg:
description: the desc of this api.
parameters:
- name: mobile
desc: the mobile number
type: string
required: true
location: form
- name: promotion
desc: the activity id
type: int
required: true
location: form
"""
fields = self.get_path_fields(path, method, view)
yaml_doc = None
if view and view.__doc__:
try:
yaml_doc = yaml.load(view.__doc__)
except:
yaml_doc = None
if yaml_doc and type(yaml_doc) != str:
_method_desc = yaml_doc.get('description', '')
params = yaml_doc.get('parameters', [])
for i in params:
_name = i.get('name')
_desc = i.get('description')
_required = i.get('required', False)
_type = i.get('type', 'string')
_location = i.get('location', 'form')
field = coreapi.Field(
name=_name,
location=_location,
required=_required,
description=_desc,
type=_type
)
fields.append(field)
else:
_method_desc = view.__doc__ if view and view.__doc__ else ''
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
if self.url and path.startswith('/'):
path = path[1:]
return coreapi.Link(
url=urlparse.urljoin(self.url, path),
action=method.lower(),
encoding=encoding,
fields=fields,
description=_method_desc
)
def get_swagger_view(title=None, url=None, patterns=None, urlconf=None):
"""
Returns schema view which renders Swagger/OpenAPI.
"""
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 = SchemaGenerator(
title=title,
url=url,
patterns=patterns,
urlconf=urlconf
)
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()
Erstellen Sie dieses Modul an einer beliebigen Stelle in der Projektstruktur. Importieren Sie get_swagger_view
von diesem Modul in project/urls.py
. Und dann entfernen Sie die get_swagger_view
Methode aus dem django_rest_swagger
Modul.
Ref: Comment by daimon99 in REST Swagger Issues
umfassende Antwort, aber es ist ein bisschen Problem mit der Probe YAML, dass Ihre Antwort zeigt, 'int' funktioniert nicht, ich ersetzte es durch eine Zeichenfolge und es funktionierte gut, einen Kommentar dazu? –
Oh. Ich habe den 'Typ' nie wirklich getestet. Danke, dass du das gesagt hast. Ich werde prüfen, was das Problem sein könnte. –