django rest JSONWebTokenAPIView 序列化程序类对象没有属性“对象”
Posted
技术标签:
【中文标题】django rest JSONWebTokenAPIView 序列化程序类对象没有属性“对象”【英文标题】:django rest JSONWebTokenAPIView serializer-class object has no attribute 'object' 【发布时间】:2019-07-05 19:19:57 【问题描述】:我正在将 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
但是当我想 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'
如何访问序列化程序实例对象属性? 序列化器是否有任何对象属性?
【问题讨论】:
我认为你的 AdabaziUserLoginJWT 应该扩展 ModelSerializer 【参考方案1】:我最近遇到了同样的错误,似乎问题在于 rest_framework_jwt 库和 rest_framework 本身的集成:rest_framework_jwt em> 似乎没有用最新版本的 rest_framework 更新,而 rest_framework 的序列化程序中的代码发生了变化(参见here)。
在新版本的rest_framework中没有serializer.object.get
这样的语法,因为:
之前的序列化器使用两步创建对象,如下:
验证数据将创建一个对象实例。此实例将 > 可用作 serializer.object。 然后调用 serializer.save() 会将对象实例保存到数据库中。
我们现在使用单步对象创建,如下所示:
验证数据使清理后的数据可用作 serializer.validated_data。 调用 serializer.save() 然后保存并返回新的对象实例。
因此,为了使用这个类,您必须使用 rest_framework 的新 API 对其进行更新。
【讨论】:
以上是关于django rest JSONWebTokenAPIView 序列化程序类对象没有属性“对象”的主要内容,如果未能解决你的问题,请参考以下文章
带有 django-rest-auth 和 django-rest-knox 的 AttributeError - 令牌序列化器
17-Django-Django REST framework-REST framework及RESTful简介
为啥 django-rest-framework 不显示 OneToOneField 数据 - django
Django + AngularJS:没有使用普通 URL 和视图的 Django REST 框架的类 REST 端点?
Django Rest Framework 和 django Rest Framework simplejwt 两因素身份验证