django-rest-framework - POST 上的 `validate()` 上未调用序列化程序 `is_valid()`

标签 django-rest-framework

我想创建一个非基于类的表单,以方便用户在所有前端应用程序中统一登录。目前,它看起来像这样

我的序列化器类:

class EmployeeLoginSerializer(serializers.Serializer):
    username = serializers.CharField(min_length=6)
    password = serializers.CharField(min_length=6)

    def validate_credentials(self, attrs):
        print('validating')
        try:
            emp: Employee = Employee.objects.get(username=attrs['username'])
            if crypto.verify_password(attrs['password'], emp.password_hash):
                return attrs
        except Exception:
            raise serializers.ValidationError("Incorrect username or password")
        raise serializers.ValidationError('Incorrect username or password')

我的 View 类:

class TestView(APIView):
serializer_class = EmployeeLoginSerializer

def get(self, request, *args, **kwargs):
    return Response({'Message': 'Get works'})

def post(self, request, *args, **kwargs):
    print(request.POST)
    serializer = self.serializer_class(data=request.POST)
    if serializer.is_valid():
        return Response({'Message': 'Credentials were correct'})

我的问题是 serializer.is_valid() 似乎没有自动调用验证。我知道我可以手动调用 serializer.validate() 但 StackOverflow 上的所有文档和问题似乎都显示 validate()is_valid()< 调用 自动,所以我觉得这不是最佳做法。有什么我想念的吗?

最佳答案

is_valid() 方法将调用 validate() 序列化器的方法和 validate<b>_FIELD_NAME()</b>方法。

在您的代码中, validate_credentials() 似乎是常规类方法,自从 credentials 以来,DRF 无法检测到它。 不是 field 在序列化器上。

关于django-rest-framework - POST 上的 `validate()` 上未调用序列化程序 `is_valid()`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56446032/

相关文章:

python - 将 url 参数传递给序列化器

python - 无法从 'detail_route' 导入名称 'rest_framework.decorators'

c++ - 使用 libcurl 和 jsoncpp 向 django 发送 POST 请求时无效的 unicode

Django DRF 创建用户

python - Django rest framework 一对一关系

django - 如何序列化多个模型对象?

django - 如何使用 Django Rest Framework 更新 OneToOneField

Django Rest Framework - 同一 api 调用中的两个模型

django - 如何在 Django Rest Framework 中处理并行请求?

python - 如何在使用 django rest auth 单击链接后验证电子邮件