Tastypie" always_return_data"选项已更改响应状态代码

时间:2017-04-03 10:58:47

标签: django rest http tastypie

我有一个Tastypie API,我想得到" id"在POST请求中创建的资源,所以我找到的唯一解决方案是" always_return_data"它返回整个对象。

from tastypie.resources import ModelResource
from tastypie.authorization import Authorization
from tastypie.authentication import SessionAuthentication

from myproject.core.models import MyModel


class MyResource(ModelResource):
    ...

    class Meta:
        queryset = MyModel.objects.all()
        resource_name = 'mymodel'
        allowed_methods = ['get', 'put', 'post']
        authentication = SessionAuthentication()
        authorization = Authorization()
        always_return_data = True  # Added later

这很好用。但是在开始时我曾经写过测试并且有:

对于POST:self.assertHttpCreated(self.api_client.post('self.detail_url', format='json', data=data))

对于PUT:self.assertHttpAccepted(self.api_client.put(self.detail_url, format='json', data=new_data))

现在我设置always_return_data = True旧测试失败后,coz POST返回200而不是201而PUT重新调整200而不是[202/204] 除了将assertHttpCreatedassertHttpAccepted替换为assertHttpOK之外,是否有其他解决方案?如果可能,是否可以返回" id" POST请求中新创建的资源,但未设置always_return_data = True。任何建议都是受欢迎的。谢谢。

1 个答案:

答案 0 :(得分:1)

根据规范(http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.6),状态代码200似乎是合适的。

对于良好做法,请始终使用list_allowed_methodsdetail_allowed_methods 而不是allowed_methods。 更改allowed_methods = ['get', 'put', 'post'],然后添加

list_allowed_methods = ['get', 'post']

detail_allowed_methods = ['get', 'put']

如果创建了新资源,请返回HttpCreated(201 Created)。如果Meta.always_return_data = True,将会有一个已填充的序列化数据。

如果现有资源已修改且Meta.always_return_data = False(默认),则返回HttpNoContent(204无内容)。如果现有资源已修改且Meta.always_return_data = True,请返回HttpAccepted(200 OK)。

对于测试用例,与assertHttpOK一起,您可以添加另一个测试用例来验证响应数据对象并请求在发送/发布时发送的数据对象。