Django REST Swaggerは指定されたapiパラメータを実現します。


なぜswaggerのapiパラメータを指定しますか?
アプリのパラメータは様々なタイプがあります。
queryパラメータ、例えば/users?role=admin
pathパラメータ、例えば/users/{id}
headerパラメータ、例えばX-MyHeader:Value
bodyパラメータは、POST、PUT、PATCH要求のbodyを記述する。
formパラメータは、Content-Type of appication/x-www-form-urlencoddとmultiad/form-dataの要求文bodyのパラメータを記述します。
swagger指定のapiパラメータは、ドキュメントの該当するapi項目にapiの記述、正常出力、異常出力、パラメータの名称、記述、必要かどうか、値の種類、パラメータの種類によって、異なるパラメータタイプの表示効果があります。swaggerはインタラクティブなapiドキュメントであり、ドキュメントに表示されているパラメータの値を直接入力して要求を送ることができ、その結果がドキュメントに表示されます。

難点
Django REST Swager<2のバージョンに対して、swaggerのapiパラメータを指定するのはとても容易で、関連している説明を特定のフォーマットとyamlフォーマットで該当するappiのビュー関数のドキュメント文字列(DocStrigs)に書くと、swagerは自動的にドキュメントにレンダリングします。たとえば、このようなフォーマットがあります。

def cancel(self, request, id):
 """
 desc:     ,           
 ret: msg
 err: 404  /msg
 input:
 - name: id
 desc:   id
 type: string
 required: true
 location: path
 """
しかし、2.0バージョンの後、Django REST Swaggerはyaml文書の文字列に対するサポートを破棄しています。
一つの解決策
Django REST frame eworkはクラスのapiビューに基づいてfilter_uを定義します。classはモデル(models)の特定のフィールドをフィルタリングして、swaggarはこれらのフィールドによってレンダリングします。

from django_filters.rest_framework.filterset import FilterSet

class ProductFilter(FilterSet):

 class Meta(object):
 models = models.Product
 fields = (
  'name', 'category', 'id', )

class PurchasedProductsList(generics.ListAPIView):
 """
 Return a list of all the products that the authenticated
 user has ever purchased, with optional filtering.
 """
 model = Product
 serializer_class = ProductSerializer
 filter_class = ProductFilter

 def get_queryset(self):
 user = self.request.user
 return user.purchase_set.all()
この解決法は半分の問題のみを解決しており、モデルに向かってのapiだけで、モデルのいくつかのフィールドをフィルタすることができます。また、apiパラメータ名がモデルフィールド名と一致しない場合は追加の処理が必要です。
啓発する
Django REST Swaggerの文書を見て、Advianced Usageによると、クラスベースの文書アプリビューはこうです。

from rest_framework.response import Response
from rest_framework.schemas import SchemaGenerator
from rest_framework.views import APIView
from rest_framework_swagger import renderers

class SwaggerSchemaView(APIView):
 permission_classes = [AllowAny]
 renderer_classes = [
 renderers.OpenAPIRenderer,
 renderers.SwaggerUIRenderer
 ]

 def get(self, request):
 generator = SchemaGenerator()
 schema = generator.get_schema(request=request)

 return Response(schema)
説明ドキュメントはschema変数に基づいてレンダリングされていますので、schema変数をリロードすることにより、apiビュー関数を解析するためのドキュメント文字列のパラメータ定義値をschema変数に割り当てることができます。
より良い解決方法
schema_を作成しますview.py:

from django.utils.six.moves.urllib import parse as urlparse
from rest_framework.schemas import AutoSchema
import yaml
import coreapi
from rest_framework_swagger.views import get_swagger_view

class CustomSchema(AutoSchema):
 def get_link(self, path, method, base_url):

 view = self.view
 method_name = getattr(view, 'action', method.lower())
 method_docstring = getattr(view, method_name, None).__doc__
 _method_desc = ''

 fields = self.get_path_fields(path, method)

 try:
  a = method_docstring.split('---')
 except:
  fields += self.get_serializer_fields(path, method)
 else:
  yaml_doc = None
  if method_docstring:
  try:
   yaml_doc = yaml.load(a[1])
  except:
   yaml_doc = None

  # Extract schema information from yaml

  if yaml_doc and type(yaml_doc) != str:
  _desc = yaml_doc.get('desc', '')
  _ret = yaml_doc.get('ret', '')
  _err = yaml_doc.get('err', '')
  _method_desc = _desc + '
<br/>' + 'return: ' + _ret + '<br/>' + 'error: ' + _err params = yaml_doc.get('input', []) for i in params: _name = i.get('name') _desc = i.get('desc') _required = i.get('required', False) _type = i.get('type', 'string') _location = i.get('location', 'form') field = coreapi.Field( name=_name, location=_location, required=_required, description=_desc, type=_type ) fields.append(field) else: _method_desc = a[0] fields += self.get_serializer_fields(path, method) fields += self.get_pagination_fields(path, method) fields += self.get_filter_fields(path, method) manual_fields = self.get_manual_fields(path, method) fields = self.update_fields(fields, manual_fields) if fields and any([field.location in ('form', 'body') for field in fields]): encoding = self.get_encoding(path, method) else: encoding = None if base_url and path.startswith('/'): path = path[1:] return coreapi.Link( url=urlparse.urljoin(base_url, path), action=method.lower(), encoding=encoding, fields=fields, description=_method_desc ) schema_view = get_swagger_view(title='API')
urls.pyではschemaを指します。ビュー:

from .schema_view import schema_view

urlpatterns = [
 url(r'^v1/api/', include([
 url(r'^doc/', schema_view),
 ])),
次に、API ViewまたはModelView Setなどの指定されたapiパラメータが必要なビュークラスにschemaを再ロードする。
schema=Customa Schema()
以上のDjango REST Swaggerが指定されたapiパラメータを実現しました。つまり、小編集が皆さんに提供したすべての内容です。参考にしていただければと思います。よろしくお願いします。