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

8 投票
2 回答
6944 浏览
提问于 2025-04-20 18:01

我创建了一个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,
            )
        )

现在我想使用django-rest-swagger这个包,自动生成这个API的文档。我已经安装了这个包,并在三重引号之间插入了你们看到的注释。当我查看django-rest-swagger为这个API生成的文档时,看到的内容如下:

enter image description here

但是,当我点击Try it out!按钮时,出现了下面的错误。特别是,它从来没有让我输入应该通过POST发送的电子邮件参数。

enter image description here

为什么Django-Swagger-Package生成的文档不让我正确地通过POST发送“email”这个参数?我该如何解决这个问题?

2 个回答

1

django-rest-swagger 尝试发送一个 POST 请求,但没有带上必要的数据。

首先,你需要像下面这样修正你的视图:

from rest_framework import status
from django.http import HttpResponse
import json

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,
        )
    )

如果你这样做了,现在应该能看到你友好的错误提示信息了。

接下来的步骤是查看 django-rest-swagger 的文档,了解如何让它在“试试这个”按钮上方显示一个 HTML 表单字段。

13

我用 cigar_example 这个例子测试了一下,它是用 django-rest-swagger 做的。在这个例子里,他们写了一个 自定义视图,但是这个视图没有显示输入参数。

最后我查看了源代码,发现 django-rest-swagger 需要 get_serializer_class 来构建请求体参数。

所以用下面的代码就可以正常工作了:

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,
             )
         )

还有 IsEmailTakenSerializer

from rest_framework import serializers


class IsEmailTakenSerializer(serializers.Serializer):
    email = serializers.EmailField()

撰写回答