为什么重写resetful JSONWebTokenSerializer只返回令牌?python
我在网上发现,我们可以通过在url中包含JSONWebTokenSerializer来覆盖它为什么重写resetful JSONWebTokenSerializer只返回令牌?python,python,validation,django-rest-framework,token,serialization,Python,Validation,Django Rest Framework,Token,Serialization,我在网上发现,我们可以通过在url中包含JSONWebTokenSerializer来覆盖它 url(r“^login/”,获取jsonwebtoken.as\u视图(serializer\u class=CustomJWTSerializer)), 看来我有 class CustomJWTSerializer(JSONWebTokenSerializer): def __init__(self, *args, **kwargs): super(JSONWebToken
url(r“^login/”,获取jsonwebtoken.as\u视图(serializer\u class=CustomJWTSerializer)),
看来我有
class CustomJWTSerializer(JSONWebTokenSerializer):
def __init__(self, *args, **kwargs):
super(JSONWebTokenSerializer, self).__init__(*args, **kwargs)
self.fields['email'] = serializers.CharField()
self.fields['password'] = PasswordField(write_only=True)
def validate(self, attrs):
credentials = {
'username': attrs.get('email'),
'password': attrs.get('password')
}
print(credentials)
if all(credentials.values()):
user = authenticate(**credentials)
if user:
if not user.is_active:
msg = _('User account is disabled.')
raise serializers.ValidationError(msg)
payload = jwt_payload_handler(user)
return {
'token': jwt_encode_handler(payload),
'user': user
}
else:
msg = _('Unable to login with provided credentials.')
raise serializers.ValidationError(msg)
else:
msg = _('Must include "{username_field}" and "password".')
msg = msg.format(username_field=self.username_field)
raise serializers.ValidationError(msg)
有了它,我可以开始覆盖原始对象,但不知何故,返回对象始终只是令牌
不知怎么的,我找不到它是在哪里产生的,看起来确实是因为
return {
'token': jwt_encode_handler(payload),
'user': user
}
即使这样,用户也不仅仅返回令牌。
我甚至尝试取出整个返回值,并使用return{}
但是使用正确的凭证,它仍然返回类似{“token”:null}
我甚至尝试过使用
返回响应({})
,但它从哪里获得{“token”:null}
以及为什么它不显示我的用户对象作为响应?我使用了print(user)
,为了确保它的存在是有效的,尽管您可以使用额外的设置-JWT\u RESPONSE\u PAYLOAD\u HANDLER-在json响应中返回键和用户。请参阅文档,这里有一个使用JWT_响应_有效负载_处理程序的示例
这是我的代码示例:
设置.py
JWT_AUTH = {
'JWT_RESPONSE_PAYLOAD_HANDLER': 'back.views.jwt_response_payload_handler',
}
在back/view.py中
from rest_framework import serializers
from django.contrib.auth.models import User
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username')
def jwt_response_payload_handler(token, user=None, request=None):
return {
'token': token,
'user': UserSerializer(user, context={'request': request}).data,
}
请写下您想要存档的内容。@Raz我想要返回用户对象,而不仅仅是令牌重写JSONWebTokenSerializer不是您想要的。您需要使用自己的响应负载处理程序。阅读@hairetdin答案并接受它作为解决方案,因为它是。我不确定他的代码是否有效,但原则是正确的。到目前为止,这是我发现的最简洁的版本。我正在将此答案保存在书签中:)