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 полная документация