2016-07-23 61 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

很晚,但它可以幫助現在正在尋找幫助的人。