1

Ich versuche, django-rest-swagger==2.1.1 mit meinem vorhandenen Projekt zu integrieren, das djangorestframework==3.5.3 verwendet.Django Rest Swagger 2: Gibt es trotzdem so weit Parameter für POST Anfragen von FUNCTION basierten Sichten zu dokumentieren?

Das Projekt enthält einige klassenbasierte Ansichten und einige funktionsbasierte Ansichten. Nach dem Integrieren von swagger zeigt es Eingabefelder für POST-Anfragen von "klassenbasierten Sichten" an (die offensichtlich Serialisierer haben), aber nicht für "funktionsbasierte Sichten". Die Frage wurde mehrfach gefragt, ich habe folgende Lösungen versucht:

Solution1 Solution2

und einige andere auch, aber nicht für meinen Fall arbeiten. Gibt es eine Möglichkeit, dies für "funktionsbasierte Ansichten" zu tun, oder muss ich sie in klassenbasierte Ansichten umwandeln?

Antwort

1

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

+0

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? –

+0

Oh. Ich habe den 'Typ' nie wirklich getestet. Danke, dass du das gesagt hast. Ich werde prüfen, was das Problem sein könnte. –

0

Sie den Dekorateur verwenden können:

from rest_framework.decorators import api_view 

und dann über Ihre Funktion Gebrauch:

@api_view(['POST']) 
Verwandte Themen