【问题标题】:Django Token and Session authDjango 令牌和会话身份验证
【发布时间】:2020-09-29 04:43:27
【问题描述】:

我正在为自定义用户创建登录模型在 django 上工作正常,现在我尝试转换为 Rest。

它正在创建令牌但它不返回令牌并且会话也是空白

(生成令牌但 serializer.data 为空白) enter image description here

(会话数据库为空) enter image description here

django Serializer.py

class UserLoginSerializer(serializers.ModelSerializer):
email = serializers.EmailField(
    required=False,
    allow_blank=True,
    write_only=True,
    label="Email "
)

password = serializers.CharField(
    required=True,
    write_only=True,
    style={'input_type': 'password'}
)

class Meta(object):
    model = User
    fields = ['email', 'password']

def validate(self, data):
    email = data.get('email', None)
    password = data.get('password', None)

    if not email:
        raise serializers.ValidationError("Please enter email to login.")

    user = User.objects.filter(Q(email=email)).exclude(email__iexact="").exclude(email__isnull=True).distinct()
    if user.exists():
        user1 = authenticate(email=email, password=password)
        if user1 is not None:
            if user1.is_active:
                token, created = Token.objects.get_or_create(user=user1)
                data['token'] = token
            else:
                raise serializers.ValidationError("Account not active.")
        else:
            raise serializers.ValidationError("Invalid credentials.")
    else:
        raise serializers.ValidationError("This email is not valid.")


    return data

Django view.py

class UserLogin(views.APIView):
permission_classes = (permissions.AllowAny, )
serializer_class = UserLoginSerializer

def post(self, request):
    serializers = self.serializer_class(data=request.data)
    print(serializers)
    if serializers.is_valid(raise_exception=True):
        print("data", serializers.data)
        return Response(serializers.data, status=status.HTTP_200_OK)
    return Response(serializers.errors, status=status.HTTP_400_BAD_REQUEST)

【问题讨论】:

    标签: python django django-rest-framework django-registration django-rest-auth


    【解决方案1】:

    您可以在 serailizers 中添加令牌字段。

    class UserLoginSerializer(serializers.ModelSerializer):
    email = serializers.EmailField(
        required=False,
        allow_blank=True,
        write_only=True,
        label="Email "
    )
    
    password = serializers.CharField(
        required=True,
        write_only=True,
        style={'input_type': 'password'}
    )
    token = serializers.SerializerMethodField()
    
    class Meta(object):
        model = User
        fields = ['email', 'password']
    
    def validate(self, data):
        email = data.get('email', None)
        password = data.get('password', None)
    
        if not email:
            raise serializers.ValidationError("Please enter email to login.")
    
        user = User.objects.filter(Q(email=email)).exclude(email__iexact="").exclude(email__isnull=True).distinct()
        if user.exists():
            user1 = authenticate(email=email, password=password)
            if user1 is not None:
                if user1.is_active:
                    token, created = Token.objects.get_or_create(user=user1)
                    data['token'] = token
                else:
                    raise serializers.ValidationError("Account not active.")
            else:
                raise serializers.ValidationError("Invalid credentials.")
        else:
            raise serializers.ValidationError("This email is not valid.")
    
    
        return data
        def get_token(self, obj):
            try:
                return Token.objects.get(user=obj).key
            except:
                return ''
    
    
    

    【讨论】:

    • 如果您考虑提供有关您为获得此结果所做的工作的更多信息,那就太好了。
    • Bob 我正在创建一个包含用户、音乐、Playlis 服务的音乐应用程序。最初我创建了一个简单的 Django 模型并且它工作正常现在我正在将该模型更改为休息(我在做所有这些事情时学习了 0 的休息知识)。更多信息意味着您希望我分享完整的代码。
    猜你喜欢
    • 1970-01-01
    • 2019-01-18
    • 2014-04-14
    • 2019-12-25
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 2014-06-08
    相关资源
    最近更新 更多