在使用带有django-rest-swagger的APIView时,如何为POST请求指定参数

utk*_*sal 9 django django-rest-framework swagger-2.0

在Django REST Swagger(2.1.0)的最新版本中,YAML文档字符串已被弃用.我无法大摇大摆地展示POST请求参数.

这是我的看法

class UserAuthenticationView(APIView):
    def post(self, request, *args, **kwargs):
        serializer = UserAuthenticationSerializer(data=self.request.data)
        if serializer.is_valid():
            user = serializer.validated_data['user']
            return Response({'token': user.auth_token.key}, status=status.HTTP_200_OK)

        return Response(serializer.errors, status=status.HTTP_401_UNAUTHORIZED)
Run Code Online (Sandbox Code Playgroud)

这是我的Serializer

class UserAuthenticationSerializer(serializers.Serializer):
    username = serializers.CharField()
    password = serializers.CharField()

    def validate(self, attrs):
        username = attrs.get('username')
        password = attrs.get('password')

        if username and password:
            user = authenticate(username=username, password=password)
            if user:

                if not user.is_active:
                    msg = 'User account is disabled.'
                    raise serializers.ValidationError(msg, code='authorization')

            else:
                msg = 'Unable to log in with provided credentials.'
                raise serializers.ValidationError(msg, code='authorization')

        else:
            msg = 'Must include "username" and "password".'
            raise serializers.ValidationError(msg, code='authorization')

        attrs['user'] = user
        return attrs
Run Code Online (Sandbox Code Playgroud)

这就是我生成的内容 在此输入图像描述

我没有获得包含POST数据字段的表单.我怎么做到的?

Ane*_*R S 17

django-rest-swagger使用rest_framework.schemas.SchemaGenerator生成模式,SchemaGenerator使用get_serializer_fields获取视图的序列化信息.get_serializer_fields检查视图是否具有get_serializer方法来生成表单.GenericAPIView提供了get_serializer,因此继承它就足够了.

继承视图GenericAPIView而不是简单APIView.并serializer_class使用适当的序列化程序添加属性

from rest_framework.generics import GenericAPIView 

class UserAuthenticationView(GenericAPIView):

    serializer_class = UserAuthenticationSerializer

    def post(self, request, *args, **kwargs):
        serializer = UserAuthenticationSerializer(data=self.request.data)
        if serializer.is_valid():
            user = serializer.validated_data['user']
            return Response({'token': user.auth_token.key}, status=status.HTTP_200_OK)    
        return Response(serializer.errors, status=status.HTTP_401_UNAUTHORIZED)
Run Code Online (Sandbox Code Playgroud)

  • 对于基于函数的视图,有什么可能的方法? (2认同)
  • 哇,这对我有用,我从 APIView 切换到 GenericAPIView 并且 swagger 自动检测序列化器中的所有字段 (2认同)

opa*_*ski 5

这是其余框架获取架构代码(其中的一部分):

def get_serializer_fields(self, path, method, view):
    """
    Return a list of `coreapi.Field` instances corresponding to any
    request body input, as determined by the serializer class.
    """
    if method not in ('PUT', 'PATCH', 'POST'):
        return []

    if not hasattr(view, 'get_serializer'):
        return []

    serializer = view.get_serializer()

    if isinstance(serializer, serializers.ListSerializer):
        return [
            coreapi.Field(
                name='data',
                location='body',
                required=True,
                type='array'
            )
        ]
...
Run Code Online (Sandbox Code Playgroud)

正如您所看到的 - 如果您get_serializer在视图上定义方法,它应该可以工作 - 它返回UserAuthenticationSerializer.

- 编辑 -

忘记:快乐编码。