【问题标题】:Error overriding jwt_response_payload_handler to add serialized user覆盖 jwt_response_payload_handler 以添加序列化用户时出错
【发布时间】:2016-08-03 15:42:27
【问题描述】:

在此函数中的注释之后,我添加了对 UserSerializer 的调用。但我似乎遗漏了此处未涵盖的内容,因为我收到错误消息。

# settings
JWT_AUTH = {
    'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=36000),
    'JWT_RESPONSE_PAYLOAD_HANDLER':
    'base.utils.jwt_response_payload_handler',
}

# serializers
class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ('url', 'username', 'email', 'groups')

# utils
def jwt_response_payload_handler(token, user=None, request=None):
    """
    Returns the response data for both the login and refresh views.
    Override to return a custom response such as including the
    serialized representation of the User.
    """

    return {
        'token': token,
        'user': UserSerializer(user).data
    }

使用 Postman POST 到 http://localhost:8000/api-token-auth/

{"username":"admin","password":"password123"}

产生的错误:

AssertionError: `HyperlinkedIdentityField` requires the request in the
serializer context. Add `context={'request': request}` when instantiating
the serializer. // Werkzeug Debugger

更改并再次发布:

return {
    'token': token,
    'user': UserSerializer(context={
      'request': request, 
      'user': user
    }).data
}

结果没有错误,但用户为空。

{
  "user": {
    "username": "",
    "email": "",
    "groups": []
  },
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0NjA1MjU5MDgsInVzZXJfaWQiOjEsImVtYWlsIjoiYWRtaW5AYWxrLmNvbSIsInVzZXJuYW1lIjoiYWRtaW4ifQ.GLTtlFk2akZIgNb4lGULhyKbgPML1IgYG5lEsfsCoaU"
}

只是为了证明问题出在我尝试使用序列化程序的方式上,我尝试了:

return {
    'token': token,
    'user': user.pk # Does the user instance contain anything?
    # 'user': UserSerializer(context={'user': user}).data
}

得到:

{
  "user": 1, # yes
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZW1haWwiOiJhZG1pbkBhbGsuY29tIiwidXNlcl9pZCI6MSwiZXhwIjoxNDYwNTI2MDc4fQ.HFOGQCM-PkBIJhWZWoD255ku719AA5n70ohcFGFhHT0"
}

我错过了什么?

  • This SO Question 看起来用户正在寻求相同的解决方案,但没有提供“什么不完全有效”的详细信息,这是我在我的问题中所做的。接受的答案也没有提供解决方案,只是“你必须以其他方式做”的回应 *

【问题讨论】:

    标签: django authentication django-rest-framework jwt


    【解决方案1】:

    通过执着于写作质量问题的魔力,我发现了缺失的句法细节!

    需要按该顺序发送用户实例和上下文,而不是将用户包含在上下文中。

    return {
        'token': token,
        'user': UserSerializer(user,context={'request': request},).data
    }
    

    在我的例子中,原因是我为 UserSerialize 子类化了 HyperlinkedModelSerializer。这需要请求上下文,以便它可以生成完全限定的 URL。

    See Docs.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-10
      • 2012-04-15
      • 2014-02-03
      • 1970-01-01
      • 2021-07-22
      • 2016-06-03
      • 1970-01-01
      • 2012-02-05
      相关资源
      最近更新 更多