2012-01-09 4 views
3

여러 사람이 데이터베이스의 행 속성을 정확히 같은 시간에 변경하거나 가능하지 않은 PUT 데이터를 변경할 수있는 Django/Tastypie 응용 프로그램을 만들었습니다. 예를 들어한 번에 한 명의 사용자 만 REST + HTTP를 사용하여 개체를 변경하도록하는 올바른 방법이 있습니까?

:

# the Django model 
class Thing(models.Model): 
     name = models.CharField(max_length=100) 
     description = models.TextField() 

# the Tastypie Resource 
class ThingResource(ModelResource): 
     class Meta: 
      queryset = Thing.objects.all() 

는 이제 사용자의 수는 어느 시점에서 Thingname 또는 description을 변경할 수 있습니다 가정 해 봅시다. 그들은 동시에 그것을 할 수 있거나 누군가가 오랜 시간 동안 응용 프로그램을 열어두고 돌아와서 변경할 수 있습니다.

내가 피하려고하는 것은 잘못된 잠정적 변경입니다.

#1 User 1: Opens app viewing Thing #1 with name = "my name", description = "my description" 
#2 User 2: Opens app viewing Thing #1 (same state as User 1) 
#3 User 2: Changes description of Thing #1 to "something" 
#4 User 1: Changes name of Thing #1 to "some other name" 

라인 #4 후 것 # 1의 상태가 name = "some other name", description = "something" 대신 name = "some other name", description = "my description"해야한다 : 다음과 같은 상황을 감안할 때.

서버의 개체가 변경되기 전에 응용 프로그램이 (실시간으로 또는 페이지의 데이터를 정기적으로 업데이트하여) 알 수 없다고 가정 할 때 이러한 상황을 어떻게 방지 할 수 있습니까?

업데이트를 할 때마다 필드를 추가하는 것을 고려한 sequence = models.PositiveIntegerField()입니다. 따라서 업데이트가 발생하면 개체의 유효 기간이 만료되었는지 여부를 알 수 있지만 가장 좋은 방법은 무엇입니까? 더 좋은 방법이 있습니까? 이것은 일반적인 패턴이 될 것 같은데, 그렇지?

+1

버전 번호를 유지하는 것은 널리 받아 들여지고 있습니다. 백 엔드에서 일종의 트랜잭션 데이터베이스를 사용해야합니다. 그렇지 않으면 어쨌든 올바른 동작을 보장 할 수 없습니다. – Pointy

+0

네, PostgreSQL을 사용하고 있습니다. – dlamotte

답변

3

RESTful 방법은 클라이언트가 Last-Modified 헤더 또는 리소스와 함께 반환 된 Etag 헤더를 추적하도록하는 것입니다. 이 게시물,

If-Unmodified-Since: <date-noted-from-initial-GET> 

또는

If-Match: <etag-noted-from-initial-GET> 

같은 헤더를 추가 할 때 클라이언트가 원래 다운로드 때문에 그런 자원이 서버에 수정 된 경우, 서버는 실패 "전제 조건을 반환해야 "응답. 클라이언트는 현재 버전을 검색하고 사용자에게 현명한 것을 표시 할 수 있습니다.

그러나 이러한 헤더에 응답하기 위해 tastypie를 얻는 것은 좀 더 어려울 수 있습니다.

+0

매우 흥미 롭습니다.나는 오래전에에 타그 (Etags)에 관해 읽었지 만, 이제는 그들이 어떻게 일해야 하는지를 이해한다. 그리고 당신 말이 맞아요, tastypie가 이것들에 적절히 반응하도록하는 것은 많은 일이 될 것이고, 나는 그것에 대해 확신하지 못합니다. 답변 해주셔서 감사합니다. – dlamotte

4

REST를 사용하면 자원 상태가 서버에 의해 관리되므로 시퀀스 필드에 대한 아이디어가 나타납니다. 서버는 자원이있는 버전을 추적하고 클라이언트는 새 버전을 보낼 때 어떤 버전이라고 생각하는지 말합니다. 클라이언트가 오인되면 서버가이를 알립니다.

Ian’s suggestion of ETags or modified dates이 올바른 방법 인 것 같습니다. this answer to a similar question에 동의합니다. 나는 실제로 이것에 대한 많은 경험이 없다.

+0

나는 내 방법이 작동하는지 확인을 위해 upvoted 비록 그것을 지적 주셔서 감사합니다. 매우 유익한 다른 답변을 연결해 주셔서 감사합니다. – dlamotte

+0

@diamotte : 당신은 매우 환영합니다. 아마도 버전 번호 일 가능성이있는 ETags에 관한 내용은 내용의 해시와는 대조적으로 꽤 흥미 롭습니다. –

관련 문제