【问题标题】:Django: Finish processing one request from a user before proceeding to the nextDjango:在继续处理下一个请求之前完成处理来自用户的一个请求
【发布时间】:2014-07-14 16:54:46
【问题描述】:

我目前正在寻找一种可以防止用户同时发出多个请求的解决方案。我希望在处理来自用户的第二个请求之前完成第一个请求。例如,假设用户 adam 喜欢和不喜欢 suzy 的照片。对照片的不喜欢和喜欢都发生在同一个视图中。

目前我遇到的问题是我同时处理两个请求。在like view的情况下,当用户喜欢某样东西时,我会创建一个like_object。当用户决定不喜欢某些东西时,我会检查数据库中是否存在like_object,然后将其删除。然而!如果第一个请求还没有完成,第二个请求中对like_object的检查会返回说没有like_object,它会创建第二个like_object。

一旦完成所有这些处理,我最终将拥有来自同一用户的同一张照片的 2 个like_objects。这很糟糕。

为了向您提供更多信息,我使用 Gunicorn 作为我的 HTTP 服务器。我运行 3 个普通工人,这就是为什么同时处理每个请求的原因。

那你觉得我能做什么?我的意思是,我正在考虑为此使用 Celery 和 RabbitMQ。每个请求将被提交到一个队列中并被异步处理。这是一种选择。但我觉得在这种情况下这可能是矫枉过正。我正在寻找可以直接在 Django 中完成的事情。嗯,让我知道可能的解决方案。

谢谢

【问题讨论】:

    标签: python django rabbitmq celery


    【解决方案1】:

    更好的方法是向 django 应用程序发送 True 或 False 而不是切换对象。此外,使用 jquery 在客户端实现它,并让 jquery 向 django 应用程序发送异步请求以设置/取消设置之类的。

    所以,类似...

    http://example.org/posts/1/like
    

    http://example.org/posts/1/unlike
    

    在浏览器上切换一个 javascript 变量,指示某项内容是否已被点赞。然后将布尔值 true 或 false 发送到 django 应用程序。

    【讨论】:

    • 嘿,谢谢你的回答,但我想出了一个更简单的解决方案,添加一个 unique_together 子句可以解决这个问题。它会在第二个请求通过时引发错误。
    【解决方案2】:

    我不知道为什么我没有早点想到这一点,我添加了一个 unique_together 子句,它将阻止创建另一个 like_object。

    【讨论】:

      猜你喜欢
      • 2020-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-16
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      相关资源
      最近更新 更多