2016-07-23 59 views
16

有一个很难配置扬鞭UI 这里是很说明文档:https://django-rest-swagger.readthedocs.io/en/latest/Django的REST框架扬鞭2.0

YAML文档字符串已被弃用。有人知道如何从Python代码中配置Swagger UI吗?或者我应该更改哪个文件以对api端点进行组合,向每个端点添加注释,在Swagger UI中添加查询参数字段?

+0

你有没有想要做的分组的例子,例如在另一个基于Swagger的API上? 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中,我更新数据字典以添加说明,查询字段并更新类型或所需功能。

Django的休息,招摇(2.0.7)
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 

更新:仅更换add_customizationsget_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”或任何类似的已命名函数 – oden

+0

我更新了答案 – bitnik

6

所以,看起来发生了什么事情,但是它已经不完整,并且缺少从代码文档中生成操作描述的能力,并且在3.5.0中有open issue about it

与此同时,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

使用所提出的解决方案是一个有点哈克但工作得很好,一个可能面临实施提出的解决方案的几个问题,但是这个文档解释了Django的休息招摇2集成以及这些问题所面临一步一步: Django Rest Swagger 2 comprehensive documentation

很晚,但它可以帮助现在正在寻找帮助的人。