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

问题描述 投票:5回答:2

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

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

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

  1. 给定响应,轻松地将ETag添加到我发送成功的响应标头中。这必须由我计算,因为它将取决于模型;它不足以散列响应值或类似的东西。
  2. 在POST / PUT上,确保我收到的ETag与我发出的ETag匹配,或拒绝请求。

这是第一步给我带来一些麻烦;我不确定哪个REST框架会使这个最简单,我也不确定实现它的最佳方法是什么。

django rest etag optimistic-locking
2个回答
0
投票

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


0
投票

Django通过装饰器(@ etc,@ original_modified,@ condition)或中间件支持ETag - 你可以查看docs。如果你想在Django Rest Framework中使用这些装饰器,你可以使用django-rest-framework-condition

© www.soinside.com 2019 - 2024. All rights reserved.