Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么重写resetful JSONWebTokenSerializer只返回令牌?python_Python_Validation_Django Rest Framework_Token_Serialization - Fatal编程技术网

为什么重写resetful JSONWebTokenSerializer只返回令牌?python

为什么重写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中包含JSONWebTokenSerializer来覆盖它
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答案并接受它作为解决方案,因为它是。我不确定他的代码是否有效,但原则是正确的。到目前为止,这是我发现的最简洁的版本。我正在将此答案保存在书签中:)