Django:如果已调用相同的视图,则停止调用该视图

时间:2019-07-13 12:45:32

标签: python django django-views

我有一个视图,当用户单击一个按钮时,它将被调用。但是,如果用户两次单击按钮,即使第一个仍在执行或运行,也会被另一个用户调用。这会产生一个问题(如果我是正确的话),那就是:它停止对第一个执行,而对另一个开始执行。请帮助我,这样我就可以停止两次调用此视图。

2 个答案:

答案 0 :(得分:0)

将请求发送到服务器后,Django将对其进行处理,并在完成后发送响应。如果没有人可以接收到响应,则什么也不会发生,但过程已经完成。您应该要求验证您的流程是否很重要。

当用户发送第二个请求时,两个请求将被处理并返回响应。如果您使用的是API,并且前端未在后端服务器中呈现,则用户可能会收到两个响应,并且取决于前端上的代码,可能会发生很多事情。他们可能会看到两个回复,也可能只会看到一个。否则第二个响应出现时,第一个响应可能会立即更新。

这可能会导致问题,具体取决于您正在运行的进程。例如,如果您要更新数据库中的记录,并且更新只能发生一次,那么第二次尝试可能会出现错误。确实很少见,而且几乎不可能,这两个请求的更新部分会在同一时间发生,这取决于您的数据库,您的代码以及许多其他事情。

有很多方法可以解决这个问题,其中大多数取决于很多事情,但我将列出其中一些选项:

1-将按钮的显示更改为none,以使用户无法再次单击它。这是一个非常简单的解决方案,并且在大多数情况下都有效,除非您有用户试图故意损害系统。

2-将用户重定向到另一个页面,然后在那里等待响应。

3-如果您的视图正在执行一些繁重的过程,这些过程运行起来很昂贵,那么只需创建一个对每个用户都有一定限制的队列系统。这通常是在具有很多用户的规模化项目中完成的。

4-使用速率限制系统一次拒绝太多请求或阻止任何非正常流量。

答案 1 :(得分:0)

我的建议,使用jQuery

$("btnSubmit").click(function(event){
event.preventDefault();
//disable the submit button
$("#btnSubmit").attr("disabled", true);
// call ur view using ajax here 
});

然后在ajax结束后激活按钮

$("#btnSubmit").attr("disabled", false);