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

发布于 2024-12-29 00:22:41 字数 533 浏览 1 评论 0原文

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

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

根据我的观点,我想这样做:

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

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

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

I'm trying to select a REST framework for Django that will allow me to easily use ETags for optimistic locking. I'm planning on examining Django-pistons and the Django Rest Framework libraries, but I'm open to any non-GPL solution (corporate licensing requirements prevent my using those).

My application is vending data from a SQLAlchemy model (not a Django model) in JSON/YAML form, and modulo the ETag issue is working just fine with the Django Rest Framework. However, I can't see an easy way to apply the ETag headers on my views.

For my views, I want to do this:

  1. Given a response, easily add an ETag to the response headers I'm sending out on success. This must be calculated by me, since it will be model dependent; it's not enough to hash the response value or anything like that.

  2. On POST/PUT, ensure that the ETag I'm receiving matches the one I sent out, or reject the request.

It's step 1 that is giving me a bit of trouble; I'm not sure which REST framework will make this easiest, nor am I sure what the best way to accomplish it is.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

七度光 2025-01-05 00:22:41

Django 通过装饰器(@etag、@last_modified、@condition)或中间件支持 ETag - 您可以检查 文档。如果你想在 Django Rest Framework 中使用这些装饰器,你可以使用 django -休息框架条件

Django supports ETags through decorators (@etag, @last_modified, @condition) or middleware - you can check the docs. If you want to use those decorators with Django Rest Framework, you can use django-rest-framework-condition.

笑咖 2025-01-05 00:22:41

框架的选择并不重要。无论如何,您都必须在缓存(memcache 或 redis)中维护一个表示资源状态的 etag。您可以使用分代缓存算法 (https://signalvnoise.com /posts/3113-基于密钥的缓存过期如何工作)。然后您可以轻松编写一个 mixin 来提取每个资源的 etag 并将其发送。根据我个人的经验,Django Rest Framework 非常适合它,因为它具有高度的灵活性和编写良好的代码。

Choice of framework does not matter. In any case, you have to maintain an etag in cache(memcache or redis) representing the state of the resource. You can use Generational Caching Algorithm (https://signalvnoise.com/posts/3113-how-key-based-cache-expiration-works). Then you can easily write a mixin that extracts the etag of every resource and sends it. In my personal experience, Django Rest Framework would be ideal for it due to its heavy flexibility and well-written code.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文