我想创建一个非基于类的表单,以方便用户跨所有前端应用程序进行统一登录。目前看起来像这样
我的序列化程序类:
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')
我的视图类:
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()
自动调用了,所以我觉得那不是最好的实践。有什么我想念的吗?
答案 0 :(得分:2)
is_valid()
方法将调用序列化程序的 validate()
方法和validate_FIELD_NAME()
方法。
在您的代码中, validate_credentials()
似乎是 常规类方法 ,自 {{ 1}} 不是序列化程序上的 credentials
。