5

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

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

就我的观点而言,我想这样做:

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

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

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

4

2 回答 2

0

框架的选择并不重要。在任何情况下,您都必须在缓存(memcache 或 redis)中维护一个表示资源状态的 etag。您可以使用分代缓存算法(https://signalvnoise.com/posts/3113-how-key-based-cache-expiration-works)。然后,您可以轻松编写一个 mixin,提取每个资源的 etag 并发送它。以我个人的经验,Django Rest Framework 非常适合它,因为它具有高度的灵活性和编写良好的代码。

于 2015-06-11T09:35:18.660 回答
0

Django 通过装饰器(@etag、@last_modified、@condition)或中间件支持 ETags - 你可以查看文档。如果你想在 Django Rest Framework 中使用这些装饰器,你可以使用django-rest-framework-condition.

于 2019-04-11T10:44:41.697 回答