首页 > 解决方案 > 如何验证 DjangoRestFramework 中的数据?这是从 Views.py 传递的

问题描述

我很难在 DjangoRestFramework 中获取和验证数据。

视图.py

 from rest_framework.views import  APIView
 from rest_framework.response import Response
 import json
 from Bigflow.Master.Model import mMasters
 import Bigflow
 mCore = Bigflow.mCore
 from rest_framework import serializers
 from Bigflow.API.serializers import loginSerializer
 from rest_framework.parsers import JSONParser
 from rest_framework.serializers import ModelSerializer

class login(APIView):

    def post(self, request):
        #jsondata = json.loads(request.body.decode('utf- 
        8')).get('ls_json')
        jsondata = json.loads(request.body.decode('utf-8'))
        user_name = jsondata.get('username')
        user_password = jsondata.get('password')

        serializer = loginSerializer(data=jsondata)


        if serializer.is_valid(raise_exception=True):
            new_data = serializer.data

        out_message = mCore.get_login(user_name, user_password)
        return Response(out_message)

序列化器.py*

from rest_framework import serializers
from Bigflow.Master.Model import mMasters
from rest_framework import exceptions


class loginSerializer(serializers.Serializer):
    user_name = serializers.CharField(required=False)
    user_password = serializers.CharField(required=False)

    class Meta:
        model = mMasters
        fields = [
            "user_name",
            "user_password"
        ]

    def validate(self, data):
        user_name = data.get('username')
        raise exceptions.ValidationError('TEST DONE')

我正在获取数据到 Loginserializer 类。我不知道如何处理这些数据并对其进行验证。

例如,user_name 不为 null,user_password 长度大于 8 。

标签: validationserializationdjango-rest-framework

解决方案


序列化器

我会同时做这两个user_nameuser_password必需的,因为它们应该被传递才能登录。您可以在下面看到密码验证示例:

class loginSerializer(serializers.Serializer):
    user_name = serializers.CharField(required=True) 
    user_password = serializers.CharField(required=True)

    class Meta:
        model = mMasters
        fields = [
            "user_name",
            "user_password"
        ]

    def validate_user_password(self, value):
        """
        Validates `user_password`.
        """
        if len(value)<8:
            raise serializers.ValidationError("Passwords must be at least 8 characters long")
        return value

查看

class login(APIView):
    def post(self, request):
        serializer = loginSerializer(data=request.data)
        if serializer.is_valid(raise_exception=True):
            data = serializer.data
            qs = User.objects.filter(
                username=data.user_name
            )
            if qs.count() == 1:
                user_obj = qs.first()
                if user_obj.check_password(data.user_password):
                  ## RETURN YOUR RESPONSE WITH AUTH TOKEN 
            return Response({"detail": "Invalid credentials"}, status=401)

推荐阅读