在Django REST应用程序中使用ETag进行乐观锁定

时间:2012-01-25 20:15:32

标签: django rest etag optimistic-locking

我正在尝试为Django选择一个REST框架,这将允许我轻松地使用ETag进行乐观锁定。我正计划检查Django-活塞和Django Rest Framework库,但我对任何非GPL解决方案持开放态度(公司许可要求阻止我使用它们)。

我的应用程序是以JSON / YAML形式从SQLAlchemy模型(不是Django模型)中出售数据,并且模拟ETag问题与Django Rest Framework一起正常工作。但是,我看不到在我的视图中应用ETag标题的简单方法。

对于我的观点,我想这样做:

  1. 给定响应,轻松地将ETag添加到我发送成功的响应标头中。这必须由我计算,因为它将取决于模型;它不足以散列响应值或类似的东西。

  2. 在POST / PUT上,确保我收到的ETag与我发出的ETag匹配,或拒绝请求。

  3. 这是给我一点麻烦的第一步;我不确定哪个REST框架会使这个最简单,也不确定最好的方法是什么。

2 个答案:

答案 0 :(得分:0)

框架的选择无关紧要。在任何情况下,您都必须在缓存(memcache或redis)中维护表示资源状态的etag。您可以使用分代缓存算法(https://signalvnoise.com/posts/3113-how-key-based-cache-expiration-works)。然后你可以轻松编写一个mixin来提取每个资源的etag并发送它。根据我的个人经验,Django Rest Framework由于其极大的灵活性和编写良好的代码而无所事事。

答案 1 :(得分:0)

Django通过装饰器(@ etag,@ last_modified,@ condition)或中间件支持ETag-您可以检查docs。如果要将这些装饰器与Django Rest Framework一起使用,则可以使用django-rest-framework-condition