2017-04-03 4 views
1

Tastypie API를 가지고 있습니다. POST 요청시 생성 된 리소스의 "id"를 얻고 싶었 기 때문에 전체 솔루션을 반환하는 "always_return_data"만있었습니다.Tastypie "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 

그리고 이것은 정상적으로 작동합니다. 그러나 처음에 나는 테스트를 작성하고 있었다했다 :

게시물에 대한

: 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))

내가 POST 사촌, always_return_data = True 이전 테스트가 실패로 설정 한 후 대신 200 returnin한다 201 및 PUT은 [202/204] 대신 [202/204]를 리 튜닝합니다. assertHttpCreatedassertHttpAcceptedassertHttpOK으로 바꾸는 것 이외의 해결책이 있습니까? 아니면 가능한 한 POST 요청시 새로 생성 된 자원의 "id"를 반환 할 수 있습니까? always_return_data = True을 설정하십시오. 어떤 제안이라도 환영합니다. 고맙습니다.

답변

1

사양 (http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.6)에 따르면 상태 코드 200이 적합 할 것 같습니다.

우수 사례로 항상 allowed_methods 대신 list_allowed_methodsdetail_allowed_methods 을 사용하십시오. allowed_methods = ['get', 'put', 'post']을 변경하고 새로운 자원이 생성되면

list_allowed_methods = ['get', 'post'] 

detail_allowed_methods = ['get', 'put'] 

를 추가 , HttpCreated (201 생성)을 반환합니다. Meta.always_return_data = True 인 경우 직렬화 된 데이터가 채워집니다.

기존 자원이 수정되고 Meta.always_return_data = False (기본값)이면 HttpNoContent (204 내용 없음)을 반환하십시오. 기존 리소스가 수정 된 경우 이면 HttpAccepted (200 OK)을 반환하십시오.

assertHttpOK과 함께 테스트 케이스의 경우 다른 테스트 케이스를 추가하여 입력/게시 중에 보내는 응답 데이터 개체와 요청 데이터 개체를 확인할 수 있습니다.

+1

답장을 보내 주셔서 감사합니다. 유용합니다. 나는 PUT 또는 POST에 200 OK가 적절하다는 것을 알고 있지만 가능한 경우 더 정확하게하려고 노력했습니다. –