为什么这个django-rest-swagger API文档不能正常显示/工作?

Saq*_*Ali 8 python django rest django-rest-framework

我已经构建了一个Django API,当通过POST给出一个电子邮件地址时,将使用一个布尔值来响应,表明我的数据库中已存在该电子邮件地址的天气:

class isEmailTaken(views.APIView):
    permission_classes = [permissions.AllowAny,]

    def post(self, request, *args, **kwargs):
        try:
            email = request.DATA['email']
        except KeyError:
            return HttpResponse(
                'An email was not given with this request.',
                status=status.HTTP_400_BAD_REQUEST,
            )
        return HttpResponse(
            json.dumps(
                User.objects.filter(email=email),
                content_type="application/json",
                status=status.HTTP_200_OK,
            )
        )
Run Code Online (Sandbox Code Playgroud)

现在我想使用django-rest-swagger包自动生成此API的文档.我安装了软件包并在三引号之间插入了您在上面看到的注释.当我查看django-rest-swagger为此API生成的文档时,我会看到下面的图片.

在此输入图像描述

但是,当我单击Try it out!按钮时,我收到如下所示的错误.值得注意的是,它从未让我有机会输入它应该通过POST发送的电子邮件参数.

在此输入图像描述

为什么Django-Swagger-Package不创建允许我通过POST正确地使用"email"参数的文档?我该如何工作?

Ven*_*chu 13

我使用由django-rest-swagger制作的cigar_example测试了这个,在那个例子中,他们编写了一个自定义视图,它也没有渲染输入参数

最后我查看源代码,发现django-rest-swagger需要get_serializer_class来构建body参数

所以它使用以下代码

class isEmailTaken(views.APIView):
    permission_classes = [permissions.AllowAny,]
    serializer_class = IsEmailTakenSerializer

    def get_serializer_class(self):
        return self.serializer_class

    def post(self, request, *args, **kwargs):
        try:
            email = request.DATA['email']
        except KeyError:
            return HttpResponse(
               'An email was not given with this request.', 
                status=status.HTTP_400_BAD_REQUEST,
            )
        return HttpResponse(
            json.dumps(
                User.objects.filter(email=email), 
                content_type="application/json",
                status=status.HTTP_200_OK,
             )
         )
Run Code Online (Sandbox Code Playgroud)

和IsEmailTakenSerializer

from rest_framework import serializers


class IsEmailTakenSerializer(serializers.Serializer):
    email = serializers.EmailField()
Run Code Online (Sandbox Code Playgroud)