16

С трудом настраиваемого Swagger UI Вот очень пояснительные документы: https://django-rest-swagger.readthedocs.io/en/latest/Django REST Framework Форс 2,0

YAML строки документации являются устаревшими. Кто-нибудь знает, как настроить пользовательский интерфейс Swagger из кода python? или какой файл следует изменить для конечных точек группы api, добавлять комментарии к каждой конечной точке, добавлять поля параметров запроса в пользовательский интерфейс Swagger?

+0

У вас есть пример типа группировки, которую вы хотите сделать, например. на другом API на основе Swagger? Swagger может быть весьма ограниченным с точки зрения группировки - я написал на заказ шаблоны для этого. Комментарии, которые, я думаю, добавляются из docstrings в методах конечных точек. Параметры запроса должны появиться, если они правильно определены ... хотя я смутно помню, что есть обстоятельства, когда они не являются. – Steve

ответ

7

Это, как мне удалось это сделать:

база urls.py

urlpatterns = [ 
... 
url(r'^api/', include('api.urls', namespace='api')), 
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), 
... 
] 

api.urls.py

urlpatterns = [ 
url(r'^$', schema_view, name='swagger'), 
url(r'^article/(?P<pk>[0-9]+)/$', 
    ArticleDetailApiView.as_view(actions={'get': 'get_article_by_id'}), 
    name='article_detail_id'), 
url(r'^article/(?P<name>.+)/(?P<pk>[0-9]+)/$', 
    ArticleDetailApiView.as_view(actions={'get': 'get_article'}), 
    name='article_detail'), 
] 

api.views.py. В MyOpenAPIRenderer я обновляю данные dict, чтобы добавить описание, поля запроса и тип обновления или необходимые функции.

class MyOpenAPIRenderer(OpenAPIRenderer): 
    def add_customizations(self, data): 
     super(MyOpenAPIRenderer, self).add_customizations(data) 
     data['paths']['/article/{name}/{pk}/']['get'].update(
      {'description': 'Some **description**', 
      'parameters': [{'description': 'Add some description', 
          'in': 'path', 
          'name': 'pk', 
          'required': True, 
          'type': 'integer'}, 
          {'description': 'Add some description', 
          'in': 'path', 
          'name': 'name', 
          'required': True, 
          'type': 'string'}, 
          {'description': 'Add some description', 
          'in': 'query', 
          'name': 'a_query_param', 
          'required': True, 
          'type': 'boolean'}, 
          ] 
      }) 
     # data['paths']['/article/{pk}/']['get'].update({...}) 
     data['basePath'] = '/api' 

@api_view() 
@renderer_classes([MyOpenAPIRenderer, SwaggerUIRenderer]) 
def schema_view(request): 
    generator = SchemaGenerator(title='A title', urlconf='api.urls') 
    schema = generator.get_schema(request=request) 
    return Response(schema) 


class ArticleDetailApiView(ViewSet): 

    @detail_route(renderer_classes=(StaticHTMLRenderer,)) 
    def get_article_by_id(self, request, pk): 
     pass 

    @detail_route(renderer_classes=(StaticHTMLRenderer,)) 
    def get_article(self, request, name, pk): 
     pass 

обновление для Джанго-покоя чванства (2.0.7): заменить только add_customizations с get_customizations.

views.py

class MyOpenAPIRenderer(OpenAPIRenderer): 
    def get_customizations(self): 
     data = super(MyOpenAPIRenderer, self).get_customizations() 
     data['paths'] = custom_data['paths'] 
     data['info'] = custom_data['info'] 
     data['basePath'] = custom_data['basePath'] 
     return data 

Вы можете прочитать swagger specification для создания пользовательских данных.

+1

Где именно вы нашли 'add_customizations'? Я не могу найти его в исходном коде вообще. В результате это решение не работает для меня. –

+0

Не знаете, к какой версии относится этот патч, но django-rest-swagger == 2.1.0 не содержит 'add_customizations' или любую аналогичную именованную функцию, которая содержит переменную 'data', описанную выше. – oden

+0

i обновил ответ – bitnik

6

Так что, похоже, что произошло django-rest-frameowrk added the new SchemeGenerator, но оно полупечено и отсутствует возможность генерировать описания действий из документов кода и иметь open issue about it, из-за 3.5.0.

В то же время django-rest-swagger продолжил работу и обновил свой код для работы с новым SchemaGenerator, что делает его breaking change.

Очень странная серия событий привела к этому): надеясь, что это скоро будет разрешено. на данный момент предложенный ответ является единственным вариантом.

7

Так как я не мог найти приемлемый вариант here я просто создал свой собственный SchemaGenerator, как это:

from rest_framework.schemas import SchemaGenerator 


class MySchemaGenerator(SchemaGenerator): 
    title = 'REST API Index' 

    def get_link(self, path, method, view): 
     link = super(MySchemaGenerator, self).get_link(path, method, view) 
     link._fields += self.get_core_fields(view) 
     return link 

    def get_core_fields(self, view): 
     return getattr(view, 'coreapi_fields',()) 

Создали вид чванства:

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 


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 = MySchemaGenerator() 
     schema = generator.get_schema(request=request) 

     return Response(schema) 

Используйте этот вид в urls.py :

url(r'^docs/$', SwaggerSchemaView.as_view()), 

Добавить нестандартное поле в пределах APIView:

class EmailValidator(APIView): 
    coreapi_fields = (
     coreapi.Field(
      name='email', 
      location='query', 
      required=True, 
      description='Email Address to be validated', 
      type='string' 
     ), 
    ) 

    def get(self, request): 
     return Response('something') 
+0

Большое спасибо! –

+0

Добро пожаловать :) – Lucianovici

0

Используя предлагаемое решение немного Hacky, но работает отлично, один может столкнуться несколько вопросов реализации предлагаемого решения, но этот документ объясняет Джанго отдыха интеграции чванства 2, а также вопросы, перед шагом за шагом: Django Rest Swagger 2 comprehensive documentation

Много поздно, но это может помочь кому-то искать помощь сейчас.