如何在Django服务器上存储有关前端按钮的信息?

时间:2019-06-30 00:14:55

标签: javascript python django ajax

基本上,我想在服务器端存储一个按钮服务,以便它可以在浏览器关闭和页面刷新时保持不变。

这是用户要尝试的操作

  1. 用户在搜索栏中搜索产品列表。
  2. 显示结果时,将为它们显示一个按钮,该按钮触发每个单独产品的操作。它们还显示有一个主按钮,可以为列出的每个产品触发相同的操作。
  3. 单击该按钮后,我想禁用它30秒钟,并通过刷新页面和关闭浏览器使其保持不变。

我做了什么

当前,我已经在客户端使用AJAX调用实现了此功能,但是如果页面刷新,它将重置按钮,他们可以再次单击它。因此,我研究了使用javascript的localStorage函数,但就我而言,最好将其存储在服务器上。

我认为需要发生的事情

  1. 在Django应用中为按钮创建模型。其属性可能是其状态,也可能是一些元数据(最后点击等)。
  2. 无论客户何时请求产品列表,视图都会发送产品列表,并且能够查询数据库中相应按钮的状态,并直接在模板中实现禁用的属性。
  3. 如果可以按下该按钮,则客户端将对服务器进行AJAX POST调用,服务器将检查按钮状态。如果可用,它将执行操作,将按钮状态更新为禁用30秒钟,然后将此信息发送回客户端,以便在DOM中反映出来。

几个问题

  1. 是否只是为按钮创建模型然后像平常一样查询数据库?
  2. 如何让Django在30秒后更新数据库以使按钮的状态从“禁用”变回“启用”?
  3. 当用户按下按钮时,它将被禁用,但是只会在数据库中将其禁用。在客户端不刷新页面的情况下,真正禁用按钮的正确方法是什么?我是否仅禁用javascript中的按钮30秒钟,然后如果他们尝试刷新页面,则视图将看到对产品列表的请求,它将检查数据库中每个按钮的状态,并将正确地提供按钮?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

  

仅仅是为按钮创建模型,然后   像平常一样查询数据库?

模型可能类似于Button (_id, last_clicked as timestamp, user_id) 查询时,您只需按timestampLIMIT 1进行排序即可获得最终点击。通过不覆盖原始值,可以确保更快的写入速度。

如果您不希望每个用户的按钮都具有相似的行为,则必须创建与单击该按钮的用户的映射。即使您当前的需求不需要它们,也可以创建一个可扩展的解决方案,其中使用该表映射用户非常容易。

  

我如何让Django在30秒后更新数据库以使   按钮的状态从禁用状态恢复为启用状态?

我避免在没有客户端请求映射到更改的情况下更改数据库。这样可以确保并发和访问控制。并且对于当前数据状态也具有更高的可预测性。之后,我建议不要在时间增量(30秒)之后更新数据库。

相反,您可以简单地比较last_clicked时间戳并在发送响应之前在服务器端或在客户端计算出增量。

考虑到客户端在其系统上的时间与服务器上的时间不同的情况,此决定可能很重要。

  

当用户按下按钮时,它将被禁用,但是   它只会使它在数据库中被禁用。什么是适当的   实际禁用按钮而无需刷新页面的方法   客户端?我只是禁用javascript中的按钮30   秒,然后如果他们尝试刷新页面,则视图将   请参阅要求的产品列表,它将检查   每个按钮状态的数据库,它将为按钮提供服务   正确吗?

您需要执行POST请求,以将按钮按下时间戳记与数据库进行通信。您还需要确保POST请求成功,因为如果关闭浏览器,失败的请求将不会保留数据。 完成上述两项操作后,您可以仅从客户端禁用按钮,而无需尝试获取按钮last_clicked的时间戳。