为什么这个django-rest-swagger API文档无法正常显示/工作?
我创建了一个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生成的文档时,看到的内容如下:
但是,当我点击Try it out!
按钮时,出现了下面的错误。特别是,它从来没有让我输入应该通过POST发送的电子邮件参数。
为什么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()