我将JSONWebTokenAPIView从rest_framework_jwt扩展到我的自定义视图:
class UserLogin(JSONWebTokenAPIView):
serializer_class = serializers.AdabaziUserLoginJWT
下面是我的自定义序列化程序类:
class AdabaziUserLoginJWT(serializers.Serializer):
username = serializers.CharField()
password = serializers.CharField(style = {'input-type':'password'})
status = serializers.SerializerMethodField(method_name='show_status')
#token = serializers.CharField(read_only=True)
class Meta():
model = Adabazi_user
fields = ('status')
def show_status(self,obj):
return obj.status
def validate(self,attrs):
credentials={
'username' : attrs.get('username'),
'password' : attrs.get('password')
}
user = authenticate(**credentials)
if user :
if user.is_active:
ada_user = Adabazi_user.objects.get(user=user)
if ada_user.status ==1:
ada_user.status = 2 #user is logged in right now
ada_user.updated_at = timezone.now()
user.last_login = timezone.now()
payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload)
return {
'token':token,
'user':user,
'adabazi_user' : ada_user}
else:
raise serializers.ValidationError('User is already logged in.')
else:
raise serializers.ValidationError('Account is deactivated.')
else:
raise serializers.ValidationError('User credentials failed.')
def create(self,validated_data):
user = validated_data['user']
adabazi_user = validated_data['adabazi_user']
user.save()
ada_user.save()
return ada_user
但是,当我想要将这个url连接到我的视图的POST
username
和password
到localhost/api/user/login/
时,出现了以下错误:
在这一行代码中,post
方法使JSONWebTokenAPIView产生错误user = serializer.object.get('user') or request.user
Exception Value: 'AdabaziUserLoginJWT' object has no attribute 'object'
如何访问序列化程序实例对象属性?序列化程序有对象属性吗?
发布于 2019-09-10 04:42:33
最近我遇到了同样的错误,问题似乎是rest_framework_jwt库和rest_framework本身的集成: rest_framework_jwt似乎没有用最新版本的rest_framework进行更新,而rest_ while的序列化程序中的代码却发生了变化(参见这里)。
在新版本的rest_framework中,没有像serializer.object.get
这样的语法,因为:
在此之前,序列化器使用了两步创建对象,如下所示: 验证数据将创建一个对象实例。这个实例将以serializer.object的形式>可用。然后调用serializer.save()将对象实例保存到数据库中。 我们现在使用单步创建对象,如下所示: 验证数据使清理后的数据以serializer.validated_data的形式可用。然后调用serializer.save()保存并返回新的对象实例。
因此,为了使用这个类,您必须使用rest_framework的新API更新它。
https://stackoverflow.com/questions/54645096
复制相似问题