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は自動的にドキュメントにレンダリングします。たとえば、このようなフォーマットがあります。
一つの解決策
Django REST frame eworkはクラスのapiビューに基づいてfilter_uを定義します。classはモデル(models)の特定のフィールドをフィルタリングして、swaggarはこれらのフィールドによってレンダリングします。
啓発する
Django REST Swaggerの文書を見て、Advianced Usageによると、クラスベースの文書アプリビューはこうです。
より良い解決方法
schema_を作成しますview.py:
schema=Customa Schema()
以上のDjango REST 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パラメータを実現しました。つまり、小編集が皆さんに提供したすべての内容です。参考にしていただければと思います。よろしくお願いします。