【发布时间】: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