我在api.py中定义了以下AuthResource。它接受对/ auth / login操作的post请求,然后返回用户的ApiKey,以便在我设置了ApiKeyAuthentication的其余资源上使用。
class AuthResource(Resource):
class Meta:
authorization = Authorization()
resource_name = 'auth'
list_allowed_methods = ['post']
def prepend_urls(self):
return [
url(r"^(?P<resource_name>%s)/login%s$" %
(self._meta.resource_name, trailing_slash()),
self.wrap_view('login'), name="api_login")
]
def login(self, request, **kwargs):
self.method_check(request, allowed=['post'])
data = self.deserialize(request, request.body, format=request.META.get('CONTENT_TYPE', 'application/json'))
email = data.get('email', '')
password = data.get('password', '')
user = authenticate(email=email, password=password)
if user:
if user.is_active:
data = {'success': True, 'api_key': ApiKey.objects.get(user=user).key}
return self.create_response(request, data)
else:
return self.create_response(request, {'success': False, 'reason': 'account_disabled'}, HttpForbidden)
else:
return self.create_response(request, {'success': False, 'reason': 'incorrect_login'}, HttpUnauthorized)
这就像我喜欢它一样,但我想采取,但我想更进一步,让这个登录操作也返回一个序列化的用户对象。当我像这样修改代码时:
if user.is_active:
data = {'success': True, 'api_key': ApiKey.objects.get(user=user).key}
data['user'] = user
return self.create_response(request, data)
不幸的是,我在Postman中收到了对POST请求的以下响应:
{"api_key": "XXXXXXXXXXXXXXXXXXXXXXXXXXX", "success": true, "user": "FirstName LastName"}
我知道这是我的用户模型__unicode__
函数的价值,但我真正想要的是完整的序列化对象。更像是:
{"api_key": "XXXXXXXXXXXXXXXXXXXXXXXXXXX", "success": true, "user": {'first_name': 'FirstName', 'last_name': 'LastName', 'email': 'email@example.com'}}
有什么想法吗?我想我不必这样做,我可以让客户端使用新获得的ApiKey向适当的UserResource提交另一个get请求,但在优化方面看起来似乎很明显。在API设计方面,我欢迎任何和所有想法/最佳实践。