django-rest-swagger: Как указать тип параметра в docstring

Я использую django-rest-framwork и django-rest-swagger.

проблема в том, что я получаю данные непосредственно из тела запроса:

def put(self, request, format=None):
    """                                                                                                                                                                                                
    This text is the description for this API                                                                                                                                                          
    username -- username                                                                                                                                                                               
    password -- password                                                                                                                                                                               
    """
    username = request.DATA['username']
    password = request.DATA['password']

но когда я пробую запрос из swagger-ui, я не могу указать "тип параметра" (это запрос по умолчанию и не могу найти способ изменить его из docstring)

мне удалось обойти мою проблему, изменив некоторую строку в функции build_query_params_from_docstring из файла "introspectors.py" но мне было интересно, есть ли другой способ сделать это.

5 ответов


UPDATE: этот ответ работает только для django-rest-swagger

документы:http://django-rest-swagger.readthedocs.org/en/latest/yaml.html

Если вы хотите поместить данные формы:

def put(self, request, format=None):
    """
    This text is the description for this API.

    ---
    parameters:
    - name: username
      description: Foobar long description goes here
      required: true
      type: string
      paramType: form
    - name: password
      paramType: form
      required: true
      type: string
    """
    username = request.DATA['username']
    password = request.DATA['password']

для тела JSON вы можете сделать что-то вроде:

def put(...):
    """
    ...

    ---
    parameters:
    - name: body
      description: JSON object containing two strings: password and username.
      required: true
      paramType: body
      pytype: RequestSerializer
    """
    ...

определить фильтр-класс в viewset. django-rest больше не делает этот материал yaml для параметров. Поля, определенные в filterclass, будут отображаться как поля в документации openapi / swagger. Это очень аккуратно.

Читать полную документацию.

http://www.django-rest-framework.org/apiguide/filtering/#djangofilterbackend

from django_filters.rest_framework.filterset import FilterSet

class ProductFilter(FilterSet):

    class Meta(object):
        models = models.Product
        fields = (
            'name', 'category', 'id', )


class PurchasedProductsList(generics.ListAPIView):
    """
    Return a list of all the products that the authenticated
    user has ever purchased, with optional filtering.
    """
    model = Product
    serializer_class = ProductSerializer
    filter_class = ProductFilter

    def get_queryset(self):
        user = self.request.user
        return user.purchase_set.all()

поля, определенные в filterseet, будут отображаться в документации de. но там не будет никакого описания.


подобно ответу Джона Ван Баскирка, вот что у меня есть:

фактическое руководство создало doc:

drf_api/business/schema.py

# encoding: utf-8
from __future__ import unicode_literals
from __future__ import absolute_import
import coreapi

schema = coreapi.Document(
    title='Business Search API',
    url='/api/v3/business/',
    content={
        'search': coreapi.Link(
            url='/',
            action='get',
            fields=[
                coreapi.Field(
                    name='what',
                    required=True,
                    location='query',
                    description='Search term'
                ),
                coreapi.Field(
                    name='where',
                    required=True,
                    location='query',
                    description='Search location'
                ),
            ],
            description='Search business listings'
        )
    }
)

затем скопировал функцию get_swagger_view и настроил ее:

drf_api/swagger.py

# encoding: utf-8
from __future__ import unicode_literals
from __future__ import absolute_import
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 django.utils.module_loading import import_string


def get_swagger_view(schema_location):
    """
    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):
            schema = None

            try:
                schema = import_string(schema_location)
            except:
                pass

            if not schema:
                raise exceptions.ValidationError(
                    'The schema generator did not return a schema Document'
                )

            return Response(schema)


    return SwaggerSchemaView.as_view()

затем подключите его к urls.py

from ..swagger import get_swagger_view
from . import views

schema_view = get_swagger_view(schema_location='drf_api.business.schema.schema')

urlpatterns = [
    url(r'^swagger/$', schema_view),

единственный способ, которым я добился успеха в определении типов параметров, - это создать представление, которое определяет, что я хочу, без использования генератора.

class SwaggerSchemaView(APIView):
permission_classes = [IsAuthenticatedOrReadOnly,]
renderer_classes = [renderers.OpenAPIRenderer, renderers.SwaggerUIRenderer]

schema = coreapi.Document(
    title='Thingy API thing',
        'range': coreapi.Link(
            url='/range/{start}/{end}',
            action='get',
            fields=[
                coreapi.Field(
                    name='start',
                    required=True,
                    location='path',
                    description='start time as an epoch',
                    type='integer'
                ),
                coreapi.Field(
                    name='end',
                    required=True,
                    location='path',
                    description='end time as an epoch',
                    type='integer'
                )
            ],
            description='show the things between the things'
        ),
    }
)

а затем использовать этот класс в urls.py

urlpatterns = [
    url(r'^$', SwaggerSchemaView.as_view()),
    ...
]

для DJANGO REST SWAGGER > 2.0: переопределите генератор схемы DRF по умолчанию, этот документ объясняет интеграцию django rest swagger 2 шаг за шагом: Django Rest Swagger 2 полная документация