将完整资源添加到TastyPie Action Response

时间:2014-05-27 17:23:37

标签: python django tastypie

我在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设计方面,我欢迎任何和所有想法/最佳实践。

0 个答案:

没有答案