django rest-swagger罐';似乎对我不起作用。我能';我不能让它记录标题以外的任何东西

django rest-swagger罐';似乎对我不起作用。我能';我不能让它记录标题以外的任何东西,django,django-rest-framework,swagger-2.0,Django,Django Rest Framework,Swagger 2.0,django rest swagger似乎放弃了对YAML文档的支持,取而代之的是一种模糊的、没有文档的方式。在过去的48个小时里,我一直在试图理解如何让它记录进入post方法的参数 例如:我有: class user_addresses(APIView): """ get all addresses or post a new one """ authentication_classes = ([JSONWebTokenAuthentication])

django rest swagger似乎放弃了对YAML文档的支持,取而代之的是一种模糊的、没有文档的方式。在过去的48个小时里,我一直在试图理解如何让它记录进入post方法的参数

例如:我有:

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允许的所有丰富数据,比如post字段名,如果它们是强制性的或非强制性的。等等,我在这里疯了,跑来跑去,除了抱怨没有办法这样做之外,什么也找不到

因此,2.0更新的想法是使用CoreAPI,即“内部”rest框架模式生成,并从中生成swagger规范

CoreAPI使用序列化程序和视图类来完成它的工作。通过序列化程序,它知道需要哪些字段,这些字段是什么类型,如果您想添加个人描述,可以使用
help\u text
参数:

some_field = serializers.Field(help_text='Field description')
在您的情况下,问题是它无法理解
APIView
和序列化程序之间的关系。我建议采取额外的步骤,转到通用视图或视图集,它们都支持可用于内省的
serializer\u 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)
对于视图来说,有一个非常简单的方法,希望它能随着时间的推移而改进。无论如何,您现在应该有一个更可接受的结果:


CoreAPI文档可以帮助您创建自定义的招摇过市视图。Swagger接受coreapi json输入来呈现视图-Django Rest Swagger使用coreapi的Python绑定来生成json()

coreapi.Document
对象包含什么? 对于每个API,您可以创建一个
coreapi.Link()
对象。 每个
链接
对象包含:

  • 网址
  • HTTP方法
  • 描述
  • 田地
字段列表必须包含
coreapi.Field()
对象。
字段
对象具有以下参数:

  • 名字
  • 必填项(该字段是否为必填项)
  • 位置(路径参数或查询参数)
  • 描述
一个例子 如果我们要使用CoreAPI,一个样例招摇过市模式将如下所示:

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
openapirederer
CoreJSONRenderer
装饰器查看视图

视图.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)
from django.conf.urls import include, url

urlpatterns = [
    url(r'^$', views.schema_view),
]
我们现在需要的只是视图的URL映射

url.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)
from django.conf.urls import include, url

urlpatterns = [
    url(r'^$', views.schema_view),
]

编写自定义的swagger可能看起来有点乏味,但您可以完全控制要在swagger视图中公开哪些数据。

是否继续使用基于函数的视图?不。事实上,我已切换到APIView类。编辑问题以反映添加了答案,如果有帮助,请告诉我。另外,如果您还没有,请查看下面的讨论,一个人建议了一种将YAML支持添加到CoreAPI生成器的方法。谢谢您提供的详细答案,我今天将尝试一下,并宣布您的答案为赏金赢家。