2016-11-24 9 views
1

Swagger UIの設定に苦労しています。非常に説明的なドキュメントは次のとおりです。https://django-rest-swagger.readthedocs.io/en/latest/Django rest framework ApiドキュメントSwagger 2.0

YAMLドキュメントストリングは推奨されていません。誰かがPythonコード内からSwagger UI(クエリパラメータなど)を設定する方法を知っていますか?

何か奇妙な理由でそれが不可能ならば。何か働いている選択肢があるのですか、それとも、手でAPIドキュメントを作成して書き込むのが最善でしょうか?

+0

私は最後に、そのいくつかのPOCを準備します.-時々あなたと分かち合うでしょう。 – opalczynski

答えて

4

OK、見つかりました。これは理想的なソリューションではありませんが、フロントエンド(Webおよびモバイル)の開発者にとっては必要です。

基本的に最新のDRFとSwaggerは、Swaggerのドキュメントを提供するためにrest_framework.schemas import SchemaGeneratorから使用します。

だから私は少しそれを拡張するために必要な:

# -*- coding: utf-8 -*- 
import urlparse 

import coreapi 
from rest_framework.schemas import SchemaGenerator 


class ParamsSchemaGenerator(SchemaGenerator): 

    def get_link(self, path, method, callback, view): 
     """ 
     Return a `coreapi.Link` instance for the given endpoint. 
     """ 
     fields = self.get_path_fields(path, method, callback, view) 
     fields += self.get_serializer_fields(path, method, callback, view) 
     fields += self.get_pagination_fields(path, method, callback, view) 
     fields += self.get_filter_fields(path, method, callback, view) 
     fields += self.get_docs_fields(path, method, callback, view) # this is the extended line; 

     if fields and any([field.location in ('form', 'body') for field in fields]): 
      encoding = self.get_encoding(path, method, callback, view) 
     else: 
      encoding = None 

     if self.url and path.startswith('/'): 
      path = path[1:] 

     return coreapi.Link(
      url=urlparse.urljoin(self.url, path), 
      action=method.lower(), 
      encoding=encoding, 
      fields=fields 
     ) 

    # and this is fully custom additional docs method; 
    def get_docs_fields(self, path, method, callback, view): 
     fields = [] 
     if hasattr(view, 'docs_fields'): 
      for field in view.docs_fields: 
       field = coreapi.Field(
        name=field.get('name'), 
        location=field.get('query'), 
        required=field.get('required'), 
        type=field.get('type'), 
        description=field.get('description') 
       ) 
       fields.append(field) 

     return fields 

その後、私は上で定義された発電機でスキーマを返す関数を定義する必要があります。

# -*- coding: utf-8 -*- 
# monkey patching FTW! 

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 kolomnie.core.schema.generator import ParamsSchemaGenerator 


def get_params_swagger_view(title=None, url=None): 
    """ 
    Returns schema view which renders Swagger/OpenAPI. 

    (Replace with DRF get_schema_view shortcut in 3.5) 
    """ 
    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 = ParamsSchemaGenerator(title=title, url=url) 
      schema = generator.get_schema(request=request) 

      if not schema: 
       raise exceptions.ValidationError(
        'The schema generator did not return a schema Document' 
       ) 

      return Response(schema) 

    return SwaggerSchemaView.as_view() 

これは私がそれを置く方法ですURLに:

if settings.DEBUG: 
    api_views = get_params_swagger_view(title='Some API') 

もう少し魔法のように、私は

# -*- coding: utf-8 -*- 


class DocsMixin(object): 
    """ 
    This mixin can be used to document the query parameters in GET 
    if there's no other way to do it. Please refer to the: ParamsSchemaGenerator.get_links 
    for more information; 
    """ 
    docs_fields = [] 

そして、これは私がそれを使用する方法です::ドキュメントのフィールドをtores SearchDocsがこれです

class BaseSearchResultsView(generics.GenericAPIView, SearchDocs): 
    .... 

class SearchDocs(DocsMixin): 
    """ 
    Documents the get query in search; 
    """ 
    docs_fields = [ 
     { 
      'name': 'q', 
      'location': 'query', 
      'required': False, 
      'type': 'string', 
      'description': 'The base query for the search;', 
     }, 
    ... 

ちょうど私がミックスインを必要としないことを見つける:)ビューに定義されているdocs_fieldsだけです。

おそらくこれは、すべてのニーズを満たしていないだろう - しかし、それは良いスタートだと思う:)コーディング

ハッピー!

関連する問題