似乎django-rest-swagger放弃了对YAML文档的支持,并用一种模糊的,没有记录的方式来替换它。我花了最后48小时试图了解如何记录我的帖子方法中的参数。
例如:我有这个:
class user_addresses(APIView):
"""
get all addresses or post a new one
"""
authentication_classes = ([JSONWebTokenAuthentication])
def get(self, request, format=None):
addresses = Address.objects.filter(owner_id=request.user.id)
print (addresses)
serializer = address_serializer(addresses, many=True)
return Response(serializer.data)
def post(self, request, format=None):
serializer = address_serializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response({'success': True,
'result': serializer.validated_data},
status=status.HTTP_201_CREATED)
return Response({'success': False,
'result': serializer.errors},
status=status.HTTP_400_BAD_REQUEST)
但是django-rest-swagger会将其显示为:
有人能指出我的方向,我可以定义swagger允许的所有丰富数据,如帖子字段名称,如果他们是强制性的。我只是疯了,在这里跑圈而且找不到任何东西,但抱怨没有办法做到这一点。
答案 0 :(得分:8)
因此2.0更新的想法是使用CoreAPI,"内部"休息框架模式生成,并从中生成swagger规范。
CoreAPI使用序列化程序和视图类来完成它的工作。从序列化程序,它知道哪些字段是必需的,这些字段是什么类型,如果您想添加个人描述,可以使用help_text
参数:
some_field = serializers.Field(help_text='Field description')
在您的情况下,问题是它无法理解APIView
和序列化程序之间的关系。我建议采取额外步骤并转移到通用视图或视图集,它们都支持可用于内省的serializer_class
属性。对于你的例子,这样的事情应该有效:
# serializer
class AddressSerializer(serializers.ModelSerializer):
line1 = serializers.CharField(help_text='Field documentation!')
class Meta:
model = Address
fields = '__all__'
read_only_fields = 'owner',
def create(self, validated_data):
validated_data['owner'] = self.context['request'].user
return super().create(validated_data)
# api class-based view
class UserAddresses(generics.ListCreateAPIView):
"""
General API documentation (not wisible in the swagger view)
get:
GET-specific documentation!
Lorem ipsum
post:
POST-specific documentation!
Dolor **sit amet**
"""
authentication_classes = ([JSONWebTokenAuthentication])
permission_classes = permissions.IsAuthenticated,
serializer_class = AddressSerializer
def get_queryset(self):
return Address.objects.filter(owner_id=self.request.user.id)
对于视图有一个specific docstirng format,它非常简单,希望能够提高加班时间。无论如何,你现在应该有更多可接受的结果:
答案 1 :(得分:5)
CoreAPI文档可以帮助您制作自定义Swagger视图。 Swagger使用coreapi json输入来呈现视图 - Django Rest Swagger使用CoreAPI的Python绑定生成JSON(https://github.com/core-api/python-client)。
coreapi.Document
对象包含什么?对于每个API,您可以创建一个coreapi.Link()
对象。
每个Link
对象包含:
字段列表必须包含coreapi.Field()
个对象。 Field
对象具有参数:
如果我们使用CoreAPI,示例Swagger Schema看起来像这样:
import coreapi
def api_schema_generator():
api_schema = coreapi.Document(
title="My Swagger",
content={
"User Addresses": {
"int_api_get": coreapi.Link(
url="/int_api/v1/addresses/",
action="get",
description="Get addresses of a user",
fields=[
coreapi.Field(
name="user_id",
required=True,
location="path",
description="Unique ID of the user whose addresses are to be found"
),
]
),
"int_api_post": coreapi.Link(
url="/int_api/v1/addresses/",
action="post",
description="Add address for a user",
fields=[
coreapi.Field(
name="user_id",
required=True,
location="path",
description="Unique ID of the user"
),
coreapi.Field(
name="address",
required=True,
location="path",
description="Address of the user"
),
]
)
}
}
)
return api_schema
我们的视图会将此coreapi.Document
对象作为输入。我们使用SwaggerUIRenderer
,OpenAPIRenderer
和CoreJSONRenderer
装饰器进行查看。
<强> views.py 强>:
from rest_framework.decorators import api_view, renderer_classes
from rest_framework_swagger import renderers as swagger_renderer
from rest_framework import renderers
@api_view()
@renderer_classes([renderers.CoreJSONRenderer,
swagger_renderer.OpenAPIRenderer,
swagger_renderer.SwaggerUIRenderer,
])
def schema_view(request):
api_schema = api_schema_generator()
return response.Response(api_schema)
我们现在需要的只是我们视图的URL映射。
<强> urls.py 强>:
from django.conf.urls import include, url
urlpatterns = [
url(r'^$', views.schema_view),
]
编写自定义招摇可能看起来有点单调乏味,但您可以完全控制要在Swagger视图中公开的数据。