Django REST Framework Swagger 2.0
С трудом настраиваю Swagger UI
Вот очень объяснительные документы: https://django-rest-swagger.readthedocs.io/en/latest/
Строки ЯМЛ являются устаревшими. Кто-нибудь знает, как настроить Swagger UI из кода python? или какой файл я должен изменить, чтобы сгруппировать конечные точки api, добавить комментарии к каждой конечной точке, добавить поля параметров запроса в Swagger UI?
4 ответов:
Вот как мне это удалось:
Основание 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Обновление для django-rest-swagger (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 , чтобы создать пользовательские данные.
Так, похоже, случилось то, что Джанго-остальное-frameowrk добавлен новый SchemeGenerator, но это придурью и отсутствует возможность генерации описаний действий от код документы, и открытый вопрос об этом, в 3.5.0.
Тем временем, django-rest-swagger пошел дальше и обновил свой код для работы с новым SchemaGenerator, что делает его разрушающим изменением на данный момент.Очень странная серия событий привела к этому): надеюсь, что это будет скоро все решится. на данный момент предлагаемый ответ является единственным вариантом.
Поскольку я не смог найти ни одного жизнеспособного варианта здесь я просто создал свой собственный 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', ())Создал представление swagger:
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')
Использование предлагаемого решения немного халтурно, но работает нормально, можно столкнуться с несколькими проблемами реализации предлагаемого решения, но этот документ объясняет интеграцию django rest swagger 2, а также проблемы, с которыми сталкиваются шаг за шагом: Django Rest Swagger 2 исчерпывающая документация
Очень поздно, но это может помочь кому-то, кто ищет помощи сейчас.
Comments