我正在使用Django Rest框架构建一个简单的API。此接口不存储任何内容,但用作另一个API的代理,用于查询商店是否有牛奶。所以我做了一个简单的序列化程序和视图:
class HasMilkSerializer(serializers.Serializer):
store = serializers.CharField(min_length=6, max_length=6)
passage_at = serializers.DateTimeField()
class HasMilkView(CsrfExemptMixin, APIView):
http_method_names = ['post']
authentication_classes = [BasicAuthWithKeys]
serializer_classes = [HasMilkSerializer]
def post(self, request):
store = request.data['store']
visit_at = parser.parse(request.data['visit_at'])
return Response({'store': store, 'has_milk': has_milk(store, visit_at)})这很好用,所以现在我想使用drf-yasg在OpenAPI规范中记录这一点。我已经安装了它,swagger显示了一些信息,但它没有显示任何关于参数或响应的规范(见下面的截图)。
我需要做什么才能让swagger正确地记录我的端点?我是否需要在swagger中进一步定义它,或者我是否需要更改端点,以便swagger可以正确地记录它?

发布于 2021-09-13 21:28:56
首先要做几件事:
在serializer_classes.
serializer_class,而不是serializer_class。因为您在这里没有使用序列化程序类,所以在我看来,您真的不需要定义它。就问题而言,由于您使用的是APIView类,因此drf-yasg不能使用模型查询集推断请求和响应正文。因此,您必须使用swagger_auto_schema装饰器手动添加响应和请求正文。你可以这样做:
from drf_yasg import openapi
from drf_yasg.utils import swagger_auto_schema
class HasMilkView(CsrfExemptMixin, APIView):
http_method_names = ['post']
authentication_classes = [BasicAuthWithKeys]
serializer_classes = [HasMilkSerializer]
@swagger_auto_schema(
request_body=openapi.Schema(
type=openapi.TYPE_OBJECT,
required=['store', 'visit_at'],
properties={
'store': openapi.Schema(type=openapi.TYPE_STRING,
max_length=6),
'visit_at': openapi.Schema(type=openapi.TYPE_STRING,
format=FORMAT_DATE)
}
),
responses={
200: openapi.Schema(
type=openapi.TYPE_OBJECT,
properties={
'store': openapi.Schema(type=openapi.TYPE_STRING,
max_length=255),
'has_milk': openapi.Schema(type=openapi.TYPE_BOOLEAN)
}
)
}
)
def post(self, request):
store = request.data['store']
visit_at = parser.parse(request.data['visit_at'])
return Response({'store': store, 'has_milk': has_milk(store, visit_at)})发布于 2021-09-13 21:15:05
APIView没有serializer_classes属性,swagger无法自动检测您的序列化程序。您可以使用其他类型的视图,如GenericAPIView或ModelViewSet。
或
如果你想使用APIView,你应该使用@swagger_auto_schema装饰器来定义你的请求/响应参数:
@swagger_auto_schema(request_body=HasMilkSerializer)
def post(self, request):
store = request.data['store']
visit_at = parser.parse(request.data['visit_at'])
return Response({'store': store, 'has_milk': has_milk(store, visit_at)})https://stackoverflow.com/questions/69167836
复制相似问题